87 votes

Activer python virtualenv dans Dockerfile

J'ai un Dockerfile où je tente d'activer python virtualenv après quoi, il doit installer toutes les dépendances au sein de ce ministère. Cependant, tout est installé dans le monde. J'ai utilisé des approches différentes et non d'entre eux travaillaient. J'ai aussi ne pas faire d'erreurs. Où est-elle un problème?

1. ENV PATH $PATH:env/bin

2. ENV PATH $PATH:env/bin/activate

3. RUN . env/bin/activate

J'ai également suivi un exemple d'un Dockerfile config pour le python-runtime image sur Google Cloud, qui est essentiellement la même chose que ci-dessus.

La définition de ces variables d'environnement sont les mêmes que l'exécution de la source /env/bin/activate.

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

En outre, qu'est - ENV VIRTUAL_ENV /env "et comment est-il utilisé?

86voto

Marcus Lind Points 3111

Vous n'avez pas besoin d'utiliser virtualenv à l'intérieur d'un Conteneur Docker.

virtualenv est utilisé pour la dépendance à l'isolement. Vous voulez éviter des dépendances ou des paquets installés de fuite entre les applications. Docker réalise la même chose, il isole vos dépendances à l'intérieur de votre conteneur et d'éviter les fuites entre les conteneurs et entre les applications.

À cet effet, il n'y a pas de point à l'aide de virtualenv à l'intérieur d'un Conteneur Docker, sauf si vous exécutez plusieurs applications dans le même conteneur, si c'est le cas, je dirais que vous êtes en train de faire quelque chose de mal et que la solution serait de l'architecte de votre application dans une meilleure façon et de les séparer en plusieurs contenants.

69voto

Flyte Points 632

Il y a des raisons parfaitement valides pour l'utilisation d'un virtualenv à l'intérieur d'un conteneur.

Vous n'avez pas nécessairement besoin d'activer le virtualenv pour installer le logiciel ou l'utiliser. Essayez d'appeler les exécutables directement à partir de la virtualenv de l' bin répertoire:

FROM python:2.7

RUN virtualenv /ve
RUN /ve/bin/pip install somepackage

CMD ["/ve/bin/python", "yourcode.py"]

31voto

monitorius Points 133

La définition de cette variables

ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

n'est pas exactement la même que juste courir

RUN . env/bin/activate

en raison de l'activation à l'intérieur de single RUN n'affectera pas les lignes ci-dessous qui RUN dans le Dockerfile. Mais la définition des variables d'environnement par le biais ENV activer votre environnement virtuel pour tous RUN des commandes.

Regardez cet exemple:

RUN virtualenv env                       # setup env
RUN which python                         # -> /usr/bin/python
RUN . /env/bin/activate && which python  # -> /env/bin/python
RUN which python                         # -> /usr/bin/python

Donc, si vous avez vraiment besoin pour activer virtualenv pour l'ensemble de la Dockerfile vous avez besoin de faire quelque chose comme ceci:

RUN virtualenv env
ENV VIRTUAL_ENV /env                     # activating environment
ENV PATH /env/bin:$PATH                  # activating environment
RUN which python                         # -> /env/bin/python

17voto

pinty Points 175

Même si je suis d'accord avec Marcus que ce n'est pas la façon de faire avec Docker, vous pouvez faire ce que vous voulez.

À l'aide de la commande EXÉCUTER du menu fixe directement ne vous donnera pas la réponse car il ne va pas s'exécuter vos instructions à partir de l'intérieur de l'environnement virtuel. Au lieu de presser les instructions exécutées dans une seule ligne à l'aide de /bin/bash. La suite Dockerfile fonctionné pour moi:

FROM python:2.7

RUN virtualenv virtual
RUN /bin/bash -c "source /virtual/bin/activate && pip install pyserial && deactivate"
...

Cela devrait installer le pyserial module seulement sur l'environnement virtuel.

-3voto

Chirag Maliwal Points 294

Si vous votre à l'aide de python 3.x :

RUN pip install virtualenv
RUN virtualenv -p python3.5 virtual
RUN /bin/bash -c "source /virtual/bin/activate"

Si vous utilisez python 2.x :

RUN pip install virtualenv
RUN virtualenv virtual
RUN /bin/bash -c "source /virtual/bin/activate"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X