¿Por qué la gente crea virtualenv en un contenedor docker?

Puede construir un contenedor con Dockerfile en unos segundos, entonces, ¿por qué la gente necesita instalar un entorno virtual dentro del contenedor de la ventana acoplable?

¿Es como una “máquina virtual” en una máquina virtual?

Estoy trabajando con virtualenvs en Docker y creo que hay varias razones:

  1. es posible que desee aislar su aplicación de los paquetes de python del sistema
  2. es posible que desee ejecutar una versión personalizada de python pero que mantenga los paquetes del sistema intactos
  3. Es posible que necesite un control de grano fino en los paquetes instalados para una aplicación específica
  4. Es posible que necesite ejecutar varias aplicaciones con diferentes requisitos.

Creo que todas estas son razones razonables para agregar un pequeño pip install virtualenv al final de la instalación. 🙂

Aquí están mis dos centavos, o más bien comentarios sobre la respuesta de @gru y algunos de los comentarios.

  • Ni la ventana acoplable ni los entornos virtuales son máquinas virtuales.
  • Cada línea en su archivo docker produce sobrecarga. Pero es cierto que los entornos virtuales en tiempo de ejecución no tienen ningún impacto
  • la idea de los contenedores docker es que usted tiene un proceso que interactúa con otros servicios (docker-) en una relación cliente-servidor. Ejecutar diferentes aplicaciones en una ventana acoplable o llamar a una aplicación desde otra dentro de una ventana acoplable está de alguna manera en contra de esa idea. Más importante aún, agrega complejidad a su ventana acoplable, que usted desea evitar.
  • “aislar” los paquetes de python que la aplicación ve (dentro de un entorno virtual) de los paquetes instalados en la ventana acoplable solo es necesario si necesita asegurar una determinada versión para uno o más paquetes.
  • El sistema instalado dentro del contenedor solo sirve como un entorno para la aplicación que está ejecutando. Ajústalo a los requisitos de tu aplicación. No hay necesidad de dejarlo “intacto”.

Entonces, en conclusión : no hay una buena razón para usar un entorno virtual dentro de un contenedor. Instale todos los paquetes que necesite en el sistema. Si necesita controlar las versiones exactas del paquete, instale el (docker-wide) con pip o similar.

Si cree que necesita ejecutar diferentes aplicaciones con diferentes versiones de paquetes dentro de un solo contenedor, retroceda un paso y reconsidere su diseño. Se dirige hacia una mayor complejidad, un mantenimiento más difícil y más dolor de cabeza. Divida la obra / servicios en varios contenedores.