web-dev-qa-db-fra.com

les condas `source activate virtualenv` ne fonctionnent pas dans Dockerfile

Scénario

J'essaie de configurer une image simple de docker (je suis assez nouveau pour docker, donc corrigez mes idées fausses possibles) en fonction du public continuumio/anaconda3 container.

La Dockerfile:

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

La construction et l’image de celle-ci par docker build -t test . se termine par l’erreur:

/bin/sh: 1: source: not found

lors de l'activation du nouvel environnement virtuel.

Suggestion 1:

Après cette réponse j'ai essayé:

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

Cela semble fonctionner au début, car il affiche: prepending /opt/conda/envs/testenv/bin to PATH, mais conda env list et ass assertecho $PATH montrent clairement que cela ne fonctionne pas:

[...]
# 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

Les fichiers Docker fonctionnent comme un MWE . J'apprécie toutes les idées. Merci!

16
ccauet

À l'aide de l'instruction ENV de Docker, il est possible d'ajouter le chemin de l'environnement virtuel de manière persistante à PATH. Bien que cela ne résolve pas l'environnement sélectionné répertorié sous conda env list.

Voir le 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

Répondant à la réponse de ccauet (que je ne pouvais pas me mettre au travail) et au commentaire de Charles Duffey sur le fait qu’il ya plus qu’à PATH, voici ce qui va régler le problème.

Lors de l'activation d'un environnement, conda définit les variables suivantes, ainsi que quelques-unes qui sauvegardent les valeurs par défaut pouvant être référencées lors de la désactivation de l'environnement. Ces variables ont été omises du fichier Docker, car l'environnement racine de conda n'a plus besoin d'être utilisé. Pour référence, il s'agit de CONDA_PATH_BACKUP, CONDA_PS1_BACKUP et _CONDA_SET_PROJ_LIB. Il définit également PS1 afin d'afficher (testenv) à gauche de la ligne d'invite du terminal, qui a également été omis. Les déclarations suivantes feront ce que vous voulez.

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

Afin de réduire le nombre de couches créées, vous pouvez combiner ces commandes en une seule commande ENV définissant également toutes les variables en même temps.

Il se peut que d'autres variables doivent être définies, en fonction du package. Par exemple,

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

Le moyen le plus simple d'obtenir ces informations consiste à appeler printenv > root_env.txt dans l'environnement racine, à activer testenv, puis à appeler printenv > test_env.txt et à examiner diff root_env.txt test_env.txt.

0
Nick Kent