it-swarm.com.de

Aktivieren Sie Python Virtualenv in Dockerfile

Ich habe eine Docker-Datei, in der ich versuche, Python virtualenv nach dem zu aktivieren, es sollte alle Abhängigkeiten innerhalb dieser Umgebung installieren. Es wird jedoch immer noch alles global installiert. Ich habe unterschiedliche Ansätze verwendet und keiner von ihnen hat funktioniert. Ich bekomme auch keine Fehler. Wo ist ein Problem?

1 .ENV PATH $PATH:env/bin

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

3 .RUN . env/bin/activate

Ich folgte auch einem Beispiel für eine Dockerfile-Konfiguration für das Python-Laufzeit-Image in Google Cloud , die im Grunde dasselbe ist wie oben.

Das Festlegen dieser Umgebungsvariablen ist dasselbe wie das Ausführen von source/env/bin/enable.

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

Was bedeutet ENV VIRTUAL_ENV /env und wie wird es verwendet?

15
igsm

Wie andere bereits gesagt haben, handelt es sich bei virtualenvs in einem Docker-Container nur um einen Edge-Fall, aber es gibt immer noch legitime Gründe dafür.

Sie müssen Virtualenv nicht unbedingt aktivieren, um Software zu installieren oder zu verwenden. Versuchen Sie stattdessen, die ausführbaren Dateien direkt aus dem bin-Verzeichnis von virtualenv aufzurufen:

FROM python:2.7

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

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

Sie müssen nicht in einem Docker-Container virtualenv verwenden.

virtualenv wird zur Abhängigkeitsisolation verwendet. Sie möchten verhindern, dass Abhängigkeiten oder installierte Pakete zwischen Anwendungen austreten. Docker erzielt dasselbe, es isoliert Ihre Abhängigkeiten in Ihrem Container und verhindert Lecks zwischen Containern und zwischen Anwendungen.

Daher ist es nicht sinnvoll, virtualenv in einem Docker Container zu verwenden, es sei denn, Sie führen mehrere Apps in demselben Container aus. Wenn dies der Fall ist, würde ich sagen, dass Sie etwas falsch machen und die Lösung darin besteht, Ihre App in einem besser und teilen Sie sie in mehrere Container.

7
Marcus Lind

Obwohl ich mit Marcus einverstanden bin, dass dies mit Docker nicht der Fall ist, können Sie machen, was Sie wollen.

Wenn Sie den RUN-Befehl von Docker direkt verwenden, erhalten Sie keine Antwort, da Ihre Anweisungen nicht innerhalb der virtuellen Umgebung ausgeführt werden. Drücken Sie stattdessen die Anweisungen, die in einer einzigen Zeile ausgeführt werden, mit/bin/bash aus. Die folgende Dockerfile hat für mich gearbeitet:

FROM python:2.7

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

Dies sollte das pyserial-Modul nur in der virtuellen Umgebung installieren.

7
pinty

Einstellen dieser Variablen

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

ist nicht genau das gleiche wie nur laufen

RUN . env/bin/activate

da die Aktivierung innerhalb eines einzelnen RUN keine Zeilen unter diesem RUN in Dockerfile beeinflusst. Das Setzen von Umgebungsvariablen über ENV aktiviert jedoch Ihre virtuelle Umgebung für alle RUN Befehle.

Schauen Sie sich dieses Beispiel an:

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

Wenn Sie also wirklich virtualenv für die gesamte Docker-Datei aktivieren müssen, müssen Sie Folgendes tun:

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

Wenn Sie Python 3.x verwenden:

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

Wenn Sie Python 2.x verwenden:

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