我已经尝试了几个小时,但无法弄清楚如何在构建过程中在 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 

起初,Docker 中的 anaconda 会提示 shell 设置不正确,所以在 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 

在构建 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 

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

CommandNotFoundError:您的 shell 未正确配置为使用“conda activate”。
要初始化你的 shell,运行
$ conda 初始化
目前支持的 shell 有:
- 重击
- 鱼
-tcsh
- xonsh
-zsh
- 电源外壳
有关更多信息和选项,请参阅“conda init --help”。
重要提示:您可能需要在运行“conda init”后关闭并重新启动 shell。

为什么这不起作用???

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

请您参考如下方法:

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

您应该将操作的逻辑组组合成一个 RUN 命令。使用&&组合命令,和 \为了可读性而换行:

RUN conda activate <myenv> \ 
 && conda install <whatever> \ 
 && ... 

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

当你从镜像启动一个容器时,你还需要调用 conda activate容器内。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!