web-dev-qa-db-fra.com

Activer python virtualenv dans Dockerfile

J'ai un fichier Docker où j'essaie d'activer python virtualenv après quoi, il devrait installer toutes les dépendances au sein de cet env. Cependant, tout est toujours installé globalement. J'ai utilisé différentes approches et aucune d'entre elles n'a fonctionné. Je ne reçois pas non plus d'erreurs. Où est 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 de configuration Dockerfile pour l'image python-runtime sur Google Cloud , qui est fondamentalement identique à ci-dessus.

La définition de ces variables d’environnement est identique à l’exécution de source/env/bin/activate.

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

De plus, que signifie ENV VIRTUAL_ENV /env et comment est-il utilisé?

15
igsm

Comme d'autres l'ont déjà dit, les virtualenvs dans un conteneur docker sont un peu un cas Edge, mais il y a toujours des raisons légitimes à cela.

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

FROM python:2.7

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

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

Vous n'avez pas besoin d'utiliser virtualenv dans un conteneur Docker.

virtualenv est utilisé pour l'isolation de dépendance. Vous souhaitez empêcher les dépendances ou les packages installés de fuir entre les applications. Docker réalise la même chose, il isole vos dépendances au sein de votre conteneur et évite les fuites entre les conteneurs et entre les applications.

Par conséquent, il est inutile d’utiliser virtualenv dans un conteneur Docker si vous exécutez plusieurs applications dans le même conteneur. Si tel est le cas, je dirais que vous faites quelque chose de mal et que la solution serait d’archiver votre application dans meilleure façon et les séparer dans plusieurs conteneurs.

7
Marcus Lind

Bien que je convienne avec Marcus que ce n’est pas la façon de faire avec Docker, vous pouvez faire ce que vous voulez.

L'utilisation de la commande RUN de Docker directement ne vous donnera pas la réponse, car elle n'exécutera pas vos instructions à partir de l'environnement virtuel. À la place, pressez les instructions exécutées sur une seule ligne avec/bin/bash. Le fichier Dockerfile suivant a 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 module pyserial uniquement sur l'environnement virtuel.

7
pinty

Si vous utilisez 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"
0
Chirag Maliwal