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" ]
8 Réponses :
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" ]
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
.
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"]
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 .
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.
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}
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"]
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
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
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.
Veuillez nous montrer votre Dockerfile; il semble que vous n'ayez pas
mro_env
par créer l'environnementmro_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 .