web-dev-qa-db-fra.com

Activer et basculer l'environnement Anaconda dans Dockerfile pendant la génération

J'essaie depuis des heures et je n'arrive pas à comprendre comment activer et changer les environnements anaconda dans un Dockerfile pendant le processus de construction

Voici le code initial:

FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04

# Set user
ENV SETUSER myuser

RUN useradd -m $SETUSER
USER $SETUSER
WORKDIR /home/$SETUSER

# Install Anaconda
RUN wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh
RUN bash Anaconda3-2019.03-Linux-x86_64.sh -b
RUN rm Anaconda3-2019.03-Linux-x86_64.sh

# Set path to conda
ENV CONDA_ENV_NAME mynewenv
RUN /home/$SETUSER/anaconda3/condabin/conda create -q --name $CONDA_ENV_NAME python=3.6 && \
    /home/$SETUSER/anaconda3/condabin/conda clean --yes --all
RUN /home/$SETUSER/anaconda3/condabin/conda activate base #Just for testing anaconda environment

Au début, anaconda dans Docker se plaindra que le shell n'est pas configuré correctement, donc après la commande conda create j'ai ajouté:

RUN /home/$SETUSER/anaconda3/condabin/conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN /home/$SETUSER/anaconda3/condabin/conda activate base

L'exécution des 3 commandes après la construction de l'image docker fonctionne (c'est-à-dire qu'elle s'exécute de manière interactive après avoir appelé docker run container-name), mais pour une raison quelconque, cela ne fonctionne pas lorsque construction le conteneur. J'ai compris que la variable $ PATH n'était pas mise à jour pendant la construction, donc comparant mon $ PATH lors de la construction et après la construction.

ENV PATH /home/$SETUSER/anaconda3/envs/$CONDA_ENV_NAME/bin:$PATH
ENV PATH /home/$SETUSER/anaconda3/condabin:$PATH
ENV PATH /home/$SETUSER/anaconda3/bin:$PATH
RUN conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN conda activate base

Maintenant, le Docker $ PATH lors de la construction et le $ PATH lorsqu'il est modifié de manière interactive lors de l'exécution du conteneur après la construction est le même, mais j'obtiens toujours l'erreur de configuration incorrecte du shell.

CommandNotFoundError: votre shell n'a pas été correctement configuré pour utiliser 'conda activate'. Pour initialiser votre shell, exécutez $ conda init Les shells actuellement supportés sont: - bash - fish - tcsh - xonsh - zsh - powershell Voir 'conda init --help "pour plus d'informations et d'options. IMPORTANT: vous devrez peut-être fermer et redémarrer votre shell après avoir exécuté" conda init ".

Pourquoi ça ne marche pas ???

J'ai vu qu'il peut y avoir une solution de contournement en utilisant un modèle de docker miniconda, mais je ne peux pas l'utiliser. Comment créer et changer un environnement anaconda pendant le processus de construction Docker? Merci!

8
xnet

Je ne l'ai pas testé avec l'image nvidia, mais versions Docker à plusieurs étapes devrait vous aider, ce qui ressemblera probablement à quelque chose comme:

# get Miniconda docker image to get a installed conda env; WARNING: That image is Debian based
FROM continuumio/miniconda3:latest AS miniconda


# your Docker commands
FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04

# Set user
ENV SETUSER myuser

RUN useradd -m $SETUSER
USER $SETUSER
WORKDIR /home/$SETUSER


# Miniconda: get necessary files from build
COPY --from=miniconda /opt/conda /opt/conda
# Set correct permissions
RUN chown -R $SETUSER: /opt/conda
#   New terminals will have conda active
# If nvidia's Docker image has no .bashrc
# COPY --from=miniconda /home/$SETUSER/.bashrc
# else
RUN echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc

# switch Shell sh (default in Linux) to bash
Shell ["/bin/bash", "-c"]

# give bash access to Anaconda, then normal anaconda commands, e.g. (-q: quiet, -y: answer yes)
RUN source /home/$SETUSER/.bashrc \
 && conda create -q --name testy \
 && conda activate testy \
 && conda install -y your_package

Inspiration de ce problème GitHub: https://github.com/ContinuumIO/docker-images/issues/89

0
NumesSanguis