Nuestros mejores desarrolladores han agotado sus reservas de café, en su búsqueda día y noche por la solución, hasta que Aurora encontró la respuesta en Gogs y hoy la comparte con nosotros.
Solución:
Teniendo en cuenta su problema, como lo sé, la forma más fácil es actualizar a la última versión de pipenv
. Todavía está en desarrollo, por lo que los problemas se solucionarán muy pronto.
Estamos usando pipenv
con docker
en producción. Y realmente nos gusta. Hay varias cosas a tener en cuenta:
- necesitas usar
--system
bandera, por lo que instalará todos los paquetes en el sistema python, y no en elvirtualenv
. Ya quedocker
Los contenedores no necesitan tenervirtualenv
s - necesitas usar
--deploy
marca, por lo que su compilación fallará si suPipfile.lock
esta fuera de fecha - necesitas usar
--ignore-pipfile
, por lo que no interferirá con nuestra configuración
Consulte los documentos oficiales para asegurarse de que esta información esté actualizada.
Considerándolo todo:
pipenv install --system --deploy --ignore-pipfile
También hay una cosa más. Si está usando el mismo Dockerfile
tanto para el desarrollo como para la producción, sería muy bueno usar también --dev
marca solo para el entorno de desarrollo.
Además, echa un vistazo a nuestro django
plantilla de proyecto para ver el ejemplo completo: wemake-django-template
La documentación de pipenv ya no recomienda oficialmente usar el --system
marca en las instancias de Docker. En cambio, sugieren usar entornos virtuales, ya que “es para implementar en un sistema operativo completo”. Esto es con la advertencia:
… la mayoría de los contenedores se implementan sin virtualenvs, como creo que ambos notaron, creo que el propósito es mantenerse delgado y reducir el área de superficie de ataque instalando lo menos posible
Como se indica en https://github.com/pypa/pipenv/pull/2762.
En cambio, la solución sería ejecutar (como se indica en una respuesta diferente aquí):
RUN pipenv install --deploy --ignore-pipfile
Y luego prefix todas las llamadas a python con pipenv run
, p.ej CMD ["pipenv", "run", "python", "hello.py"]
PD. Me hubiera gustado poner esto como un comentario a la respuesta aceptada, pero no tengo la reputación.
La respuesta directa a esta pregunta es no usar shell
, sino más bien run
:
CMD ["pipenv", "run", "python", "my/app.py"]
Si necesita más flexibilidad, también puede pipenv run sh init.sh
, lo que crearía un shell inicializado con todos los pipenv
Variables de entorno.
De hecho, prefiero el enfoque que menciona C. Sweet. Si puede preconstruir su entorno virtual y simplemente copiarlo (configurando PIPENV_VENV_IN_PROJECT
luego usando un anidado FROM
seguido por COPY --from=builder-image
), no necesitas python
ni pipenv
ni pipenv
dependencias en su contenedor final. Esta muy reduce el tamaño de la imagen final.
Dockerfile
:
WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]
init.sh
:
source /etc/service/my/.venv/bin/activate
python my/app.py
Aquí puedes ver las reseñas y valoraciones de los lectores
Si te ha sido provechoso este post, nos gustaría que lo compartas con otros entusiastas de la programación y nos ayudes a difundir esta información.