使用已激活的conda环境交互式运行Docker

6

我想创建一个docker镜像,使得当您交互运行它时,一个conda环境已经被激活。

当前状态:

docker run -it my_image
(base) root@1c32ba066db2:~# conda activate my_env
(my_env) root@1c32ba066db2:~#

期望状态:
docker run -it my_image
(my_env) root@1c32ba066db2:~#

更多信息:

在我的Dockerfile中,我包含了所有必要的RUN命令来安装conda、创建环境并激活环境。以下是相关部分的复制:

SHELL [ "/bin/bash", "--login", "-c" ]

...

# Install miniconda.
ENV CONDA_DIR $HOME/miniconda3
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
    chmod +x ~/miniconda.sh && \
    ~/miniconda.sh -b -p $CONDA_DIR && \
    rm ~/miniconda.sh
# Make non-activate conda commands available.
ENV PATH=$CONDA_DIR/bin:$PATH
# Make conda activate command available from /bin/bash --login shells.
RUN echo ". $CONDA_DIR/etc/profile.d/conda.sh" >> ~/.profile
# Make conda activate command available from /bin/bash --interative shells.
RUN conda init bash

# Create and activate the environment.
RUN conda env create --force -f environment.yml
RUN conda activate my_env

当我运行这个命令时,conda activate my_env似乎运行并成功了。但是当我通过docker run -it交互进入时,激活的环境是(base)

另外,我尝试将最后一条命令改为CMD conda activate my_env,但这只会运行该命令而不进入交互模式。

2个回答

7
每个 RUN 语句(包括 docker run)都在一个新的 shell 中执行,所以不能仅仅在一个 RUN 命令中激活环境并期望它在后续的 RUN 命令中保持活跃。
相反,你需要将激活环境作为 shell 初始化的一部分。已经将 SHELL 命令更改为包括 --login,这很好。现在只需将 conda activate my_env 添加到 .profile.bashrc 中:
...
# Create and activate the environment.
RUN conda env create --force -f environment.yml
RUN echo "conda activate my_env" >> ~/.profile

请确保这是在Conda添加的部分之后。


2
对于交互式容器,有数不清的解决方案,但这个是最好的一个。非常感谢! - Yishai E

2
在我的Dockerfile中,以下代码执行了你所描述的操作:
# Install anaconda
RUN cd $HOME && wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-x86_64.sh && bash Miniconda3-py38_4.10.3-Linux-x86_64.sh -b -p $HOME/miniconda
# Create env
RUN $HOME/miniconda/bin/conda init bash
RUN $HOME/miniconda/bin/conda env create -f my_env.yml
# Activate conda environment on startup
RUN echo "export PATH=$HOME/miniconda/bin:$PATH" >> $HOME/.bashrc
RUN echo "conda init bash" >> $HOME/.bashrc
RUN echo "conda activate my_env" >> $HOME/.bashrc
SHELL ["/bin/bash"]

导致结果如下:

(my_env) root@e5fe69843fa1:/# 

在运行交互式容器时,请记得将所有my_env的实例更改为您的conda环境名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接