10
votes

Activer l'environnement conda dans le docker

J'ai besoin d'activer l'environnement dans le docker et d'exécuter une commande dans cet environnement. Je crée l'environnement, mais j'essaye ensuite d'activer cet environnement et d'exécuter la commande de cette manière:

FROM continuumio/miniconda3

ADD /src/mro_env.yml /src/mro_env.yml
RUN conda env create -f /src/mro_env.yml

# Pull the environment name out of the mro_env.yml
RUN echo "source activate $(head -1 /src/mro_env.yml | cut -d' ' -f2)" > ~/.bashrc
ENV PATH /opt/conda/envs/$(head -1 /src/mro_env.yml | cut -d' ' -f2)/bin:$PATH

CMD [ "source activate mro_env && ipython kernel install --user --name=mro_env" ]

mais quand j'ai exécuté docker, j'obtiens une erreur:

[FATAL tini (8)] exec source activate mro_env && ipython kernel install 
--user --name=mro_env failed: No such file or directory

C'est tout le Dockerfile:

CMD [ "source activate mro_env && ipython kernel install --user --name=mro_env" ]


7 commentaires

Veuillez nous montrer votre Dockerfile; il semble que vous n'ayez pas mro_env par créer l'environnement mro_env . Veuillez également consulter la documentation officielle de l'instruction CMD.


@JordanSinger j'ai ajouté le Dockerfile


Êtes-vous sûr que la création de votre environnement a réussi?


@FabienP Oui. l'environnement installé avec succès. le problème est l'intégration avec le notebook jupyter. mon objectif est d'installer l'environnement sur jupyter, et de lancer jupyter avec cet environnement. Avez-vous une idée de comment pourrais-je faire cela?


La façon dont je fais cela est généralement d'installer Jupyter dans l'environnement, puis de le lancer à partir de là. Sinon, vous pouvez consulter nb_conda_kernels pour accéder à cet environnement depuis votre serveur Jupyter.


J'ai essayé d'installer Jupyter dans l'environnement, puis de le lancer à partir de là, mais je n'ai pas réussi à lancer le jupyter à partir du dockerfile. Avez-vous une idée de l'apparence du fichier docker pour lancer Jupyter avec l'environnement?


Pensez à adapter cette réponse .


8 Réponses :


6
votes

Vous pouvez définir CONDA_DEFAULT_ENV

Comme ça:

FROM continuumio/miniconda3

ADD /src/environment.yml /src/environment.yml

RUN conda env create -f /src/environment.yml
ENV PATH /opt/conda/envs/mro_env/bin:$PATH
RUN /bin/bash -c "source activate mro_env"

CMD [ "python", "test.py" ]

MISE À JOUR:

Meilleure utilisation activer. Travaille pour moi:

FROM continuumio/miniconda3

ARG conda_env=mro_env

ADD /src/environment.yml /src/environment.yml
RUN conda env create -f /src/environment.yml

ENV PATH /opt/conda/envs/$conda_env/bin:$PATH
ENV CONDA_DEFAULT_ENV $conda_env

CMD [ "python", "test.py" ]


3 commentaires

Il est Préfixer de l'env Conda bin qui peut fonctionner, pas sûr de ce que le rôle de CONDA_DEFAULt_ENV est ici. Et cela pourrait conda activate car vous ne définissez pas d'autres variables comme CONDA_SHLVL etc ...


Mon problème est de lancer jupyter avec cet environnement. Avez-vous une idée comment installer l'environnement sur jupyter et le lancer avec l'environnement?


Spécifier /bin/bash -c "source activate mro_env" semble totalement inutile puisque le shell actif pour le ENTRYPOINT et / ou le CMD qui suivent n'est pas bash ; c'est évidemment sh . La définition de CONDA_DEFAULT_ENV semble également inutile. Dans les deux cas, le vrai travail est effectué par ENV PATH .



7
votes

J'ai suivi ce tutoriel et cela a fonctionné. Exemple Dockerfile:

FROM continuumio/miniconda
WORKDIR /usr/src/app
COPY ./ ./
RUN conda env create -f environment.yml

# Make RUN commands use the new environment:
SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"]

EXPOSE 5003
# The code to run when container is started:
ENTRYPOINT ["conda", "run", "-n", "myenv", "python3", "src/server.py"]


3 commentaires

Le tutoriel que vous avez mentionné ici (et tout le site Web) vaut chaque minute passée à le lire. Merci.


La commande SHELL ne fonctionne pas et fait que le reste de mon code pense que c'est entre guillemets


Pour la dernière fois, conda run tampon toutes les sorties / erreurs standard jusqu'à ce que le processus soit terminé, ce n'est donc pas une option pour une application interagissant sur les E / S standard. Je suppose qu'il pourrait toujours exécuter un serveur, mais ne vous attendez pas à surveiller les messages stderr pendant son exécution. En outre, ce "tutoriel" a des problèmes, comme le premier exemple échoue uniquement parce que l'auteur ne chaîne pas correctement ses commandes en un seul RUN (c'est-à-dire, utilise && ), et exécute inutilement conda init lorsque l'image de base a déjà effectué cette configuration .



2
votes

Je suis tombé sur cette question en essayant d'activer un environnement, puis en installant des paquets à l'intérieur. La solution SHELL n'a pas fonctionné pour moi (peut-être parce que j'essayais cela sur une ancienne version de conda - 4.5.4 pour être précis).

La solution est d'activer l'environnement et d'exécuter toutes les commandes requises dans un nouveau shell. Souvenez-vous également que chaque RUN démarrera un nouveau shell qui ne se souviendra de rien du RUN précédent.

FROM continuumio/miniconda3

ADD /src/environment.yml /src/environment.yml

RUN conda env create -f /src/environment.yml
ENV PATH /opt/conda/envs/mro_env/bin:$PATH
RUN /bin/bash -c "source activate mro_env \
    && conda config --add channels conda-forge \
    && conda install Jupiter \
    && conda env list"

CMD [ "python", "test.py" ]

Notez que chaque commande est dans "" du même / bin / bash -c.


0 commentaires

3
votes

Similaire à d'autres réponses mais avec SHELL qui a l'air plus propre

RUN wget \
https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& mkdir /root/.conda \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm -f Miniconda3-latest-Linux-x86_64.sh \
&& echo "source activate base" > ~/.bashrc

SHELL ["/bin/bash", "-c"]
ARG CONDA_ENV=env_name 
# Create env
RUN conda --version \
  && conda create -n ${CONDA_ENV} python=3.7 \
  && source activate ${CONDA_ENV}


0 commentaires

3
votes

Je comprends qu'il n'y a pas de solution unique, mais c'est ce que j'utilise avec mes applications Flask:

-- project
    -- app
        -- app.py
    -- environment.yaml
    -- Dockerfile

La logique est très simple. Tout d'abord, le fichier env est copié après la création d'env. Ensuite, les fichiers d'application (c'est là que se trouvent tous mes fichiers d'application Flask) sont copiés et à l'aide de CMD, l'application est démarrée en pointant vers l'environnement env.

Voici la structure de répertoire de projet que j'ai utilisée avec le Dockerfile:

FROM continuumio/miniconda3

COPY environment.yml .
RUN conda env create -f environment.yml

COPY app /app
WORKDIR /app

CMD ["conda", "run", "-n", "my_env", "python", "app.py"]


0 commentaires

4
votes

Le problème pour moi était que l'exécution de la commande conda activate env intérieur de docker après l'installation a amené conda à me demander d'utiliser la commande conda init bash . Cependant, cette commande vous demande de redémarrer le shell, ce que nous ne voulons pas faire dans docker. Donc, la solution est de réaliser que la raison conda laquelle conda vous demande de redémarrer le shell est parce qu'il a modifié et veut recharger le contenu de ~/.bashrc . Nous pouvons le faire manuellement et éviter de redémarrer le shell en utilisant:

FROM ubuntu:18.04
# update apt and get miniconda
RUN apt-get update \
    && apt-get install -y wget \
    && wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh


# install miniconda
ENV PATH="/root/miniconda3/bin:$PATH"
RUN mkdir /root/.conda && bash Miniconda3-latest-Linux-x86_64.sh -b

# create conda environment
RUN conda init bash \
    && . ~/.bashrc \
    && conda create --name test-env python=3.7 \
    && conda activate test-env \
    && pip install ipython

Voici le fichier docker complet pour ceux qui le souhaitent:

. ~/.bashrc


0 commentaires

1
votes

Pour moi, la solution présentée ici a fonctionné sans problème:

FROM continuumio/miniconda3
RUN conda create -n env python=3.6
RUN echo "source activate env" > ~/.bashrc
ENV PATH /opt/conda/envs/env/bin:$PATH


0 commentaires

1
votes

Comme le fait remarquer l'utilisateur merv dans l'un des commentaires ci-dessus (désolé, je n'ai pas assez de représentants pour voter pour le commentaire), conda run tampon tous les stdout / stderr, ce qui le rend inutilisable pour les applications qui interagissent ou même simplement pour afficher les journaux sur I / O.

J'ai remarqué qu'il n'y avait pas de réponse acceptée, alors je publie simplement ce qui a très bien fonctionné pour moi:

Vous pouvez utiliser un script de point d'entrée pour activer l'environnement conda et le laisser prendre en charge d'autres entrées du Dockerfile de sorte que le script python puisse être exécuté dans l'environnement conda activé

Exemple Dockerfile:

#!/bin/bash --login
set -e

# activate conda environment and let the following process take over
conda activate myenv
exec "$@"

Où le entrypoint.sh ressemble à ceci:

FROM continuumio/miniconda3

# make docker use bash instead of sh
SHELL ["/bin/bash", "--login", "-c"]

# copy all necessary files
COPY environment.yml .
COPY ownchain/mypyscript.py .
COPY entrypoint.sh /usr/local/bin/

# make entrypoint script executable
RUN chmod u+x /usr/local/bin/entrypoint.sh
# create environment
RUN conda env create -f environment.yml

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["python", "mypyscript.py"]

Tout le crédit à David R. Pugh de ce post qui contient plus de détails, en particulier en ce qui concerne Jupyter.


0 commentaires