Saltar al contenido

¿Cómo hacer que pipenv se ejecute en docker?

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:

  1. necesitas usar --system bandera, por lo que instalará todos los paquetes en el sistema python, y no en el virtualenv. Ya que docker Los contenedores no necesitan tener virtualenvs
  2. necesitas usar --deploy marca, por lo que su compilación fallará si su Pipfile.lock esta fuera de fecha
  3. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *