web-dev-qa-db-de.com

condas `source enable virtualenv` funktioniert nicht in Dockerfile

Szenario

Ich versuche, ein einfaches Docker-Image einzurichten ( Ich bin relativ neu im Docker, daher korrigieren Sie bitte meine möglichen Missverständnisse ) basierend auf dem öffentlichen continuumio/anaconda3 container.

Der Dockerfilename__:

FROM continuumio/anaconda3:latest

# update conda and setup environment
RUN conda update conda -y \
    && conda env list \
    && conda create -n testenv pip -y \
    && source activate testenv \
    && conda env list

Gebäude und Bild davon durch docker build -t test . endet mit dem Fehler:

/bin/sh: 1: source: not found

beim Aktivieren der neuen virtuellen Umgebung.

Vorschlag 1:

Folgende diese Antwort habe ich versucht:

FROM continuumio/anaconda3:latest

# update conda and setup environment
RUN conda update conda -y \
    && conda env list \
    && conda create -y -n testenv pip \
    && /bin/bash -c "source activate testenv" \
    && conda env list

Dies scheint zunächst zu funktionieren, da es Folgendes ausgibt: prepending /opt/conda/envs/testenv/bin to PATH, aber conda env list sowie ass echo $PATH zeigen deutlich, dass dies nicht der Fall ist:

[...]
# conda environments:
#
testenv                  /opt/conda/envs/testenv
root                  *  /opt/conda

---> 80a77e55a11f
Removing intermediate container 33982c006f94
Step 3 : RUN echo $PATH
---> Running in a30bb3706731
/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Die Docker-Dateien funktionieren sofort als MWE. Ich freue mich über jegliche Ideen. Vielen Dank!

16
ccauet

Mit der Andockanweisung ENV kann der Pfad der virtuellen Umgebung dauerhaft zu PATH hinzugefügt werden. Obwohl dies die ausgewählte unter conda env list aufgelistete Umgebung nicht löst.

Siehe die MWE:

FROM continuumio/anaconda3:latest

# update conda and setup environment
RUN conda update conda -y \
    && conda create -y -n testenv pip

ENV PATH /opt/conda/envs/testenv/bin:$PATH

RUN echo $PATH
RUN conda env list
6
ccauet

Huckepack auf die Antwort von ccauet (was ich nicht schaffen konnte) und Charles Duffeys Kommentar, dass mehr als nur PATH dabei ist, wird sich hier um das Problem kümmern.

Wenn Sie eine Umgebung aktivieren, legt conda die folgenden Variablen sowie einige davon fest, mit denen Standardwerte gesichert werden, auf die bei der Deaktivierung der Umgebung verwiesen werden kann. Diese Variablen wurden aus der Docker-Datei weggelassen, da die Root-Conda-Umgebung nie mehr verwendet werden muss. Als Referenz sind dies CONDA_PATH_BACKUP, CONDA_PS1_BACKUP und _CONDA_SET_PROJ_LIB. Es legt auch PS1 fest, um (testenv) links von der Eingabeaufforderungszeile des Terminals anzuzeigen, die ebenfalls weggelassen wurde. Die folgenden Anweisungen tun, was Sie wollen.

ENV PATH /opt/conda/envs/testenv/bin:$PATH
ENV CONDA_DEFAULT_ENV testenv
ENV CONDA_PREFIX /opt/conda/envs/testenv

Um die Anzahl der erstellten Layer zu verringern, können Sie diese Befehle zu einem einzigen ENV-Befehl zusammenfassen, um alle Variablen gleichzeitig festzulegen.

Möglicherweise müssen einige andere Variablen festgelegt werden, die auf dem Paket basieren. Zum Beispiel,

ENV GDAL_DATA /opt/conda/envs/testenv/share/gdal
ENV CPL_Zip_ENCODING UTF-8
ENV PROJ_LIB /opt/conda/envs/testenv/share/proj

Der einfachste Weg, diese Informationen abzurufen, besteht darin, printenv > root_env.txt in der Root-Umgebung aufzurufen, testenv zu aktivieren, dann printenv > test_env.txt aufzurufen und diff root_env.txt test_env.txt zu überprüfen.

0
Nick Kent