在构建期间在Dockerfile中激活和切换Anaconda环境

xne*_*net 5 python anaconda miniconda dockerfile

我已经尝试了好几个小时,无法在构建过程中弄清楚如何在Dockerfile中激活和切换anaconda环境。

这是初始代码:

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
Run Code Online (Sandbox Code Playgroud)

首先,Docker中的anaconda会抱怨外壳设置不正确,因此在conda create命令之后添加了:

RUN /home/$SETUSER/anaconda3/condabin/conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN /home/$SETUSER/anaconda3/condabin/conda activate base
Run Code Online (Sandbox Code Playgroud)

在构建docker镜像后运行3个命令即可(即在调用docker run container-name之后交互运行),但是由于某种原因,在构建容器时不起作用。我发现$ PATH变量在构建期间未更新,因此在构建时和构建后比较我的$ PATH。

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
Run Code Online (Sandbox Code Playgroud)

现在,构建时的Docker $ PATH和构建后运行容器时进行交互修改时的$ PATH是相同的,但是我仍然遇到了shell无法正确设置的错误。

CommandNotFoundError:您的外壳尚未正确配置为使用“ conda activate”。要初始化您的shell,请运行$ conda init。当前支持的shell是:-bash-fish-tcsh-xonsh-zsh-powershell有关更多信息和选项,请参见'conda init --help'。重要信息:运行“ conda init”后,您可能需要关闭并重新启动Shell。

为什么这不起作用???

我已经看到使用miniconda docker模板可能有解决方法,但是我不能使用它。如何在Docker构建过程中创建和切换anaconda环境?谢谢!

Rol*_*ber 12

您的 Dockerfile 中有太多的 RUN 命令。不仅仅是每次 RUN 在图像中创建一个新层。也是每个 RUN 命令启动一个新的 shell,并且conda activate仅适用于当前的 shell。

您应该将操作的逻辑组组合到单个 RUN 命令中。使用&&的命令相结合,并\打破了可读性行:

RUN conda activate <myenv> \
 && conda install <whatever> \
 && ...
Run Code Online (Sandbox Code Playgroud)

请记住:在 RUN 命令结束时,shell 将消失。因此,如果您之后想对该 conda 环境执行其他操作,则必须conda activate再次运行,或者使用-n <myenv>将某些内容放入环境中而不先激活它。

当您从镜像启动容器时,您还必须conda activate在容器内部调用。


Acu*_*nus 8

假设您要安装 conda 环境并在其中运行某些内容,此方法用于ENV PATH在该 conda 环境中间接启动 python。人们可能会想知道这种方法是否真的激活了环境,但只要后续命令有效,而且确实有效,这可能无关紧要。

FROM continuumio/miniconda3:latest
WORKDIR myappdir
COPY environment.yml .
RUN set -x && \
#   apt-get update && apt-get -y install gcc && \
    conda install -n base -c defaults conda=4.* && \
    conda env create -n condaenv  # Installs environment.yml && \
    conda clean -a
COPY myapppkg myapppkg
ENV PATH /opt/conda/envs/condaenv/bin:$PATH
ENTRYPOINT ["python", "-m", "myapppkg"]
Run Code Online (Sandbox Code Playgroud)

我建议不要使用conda run,而这是严重错误的历史实验由于如这一个影响它。尽管此特定错误现已修复,但其持续的“实验性”性质conda run -h表明它可以再次破坏上游,从而限制了人们对其的信任。

以供参考:


Num*_*uis 6

我还没有使用 nvidia 映像对其进行测试,但多阶段 Docker 构建应该可以帮助您,它可能类似于:

# 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
Run Code Online (Sandbox Code Playgroud)

来自此 GitHub 问题的灵感:https://github.com/ContinuumIO/docker-images/issues/89