docker run与已激活的conda环境交互

Ben*_*ine 7 docker conda dockerfile

我想创建一个 docker 映像,以便当您以交互方式运行它时,conda 环境已经激活。

当前状态:

docker run -it my_image
(base) root@1c32ba066db2:~# conda activate my_env
(my_env) root@1c32ba066db2:~#
Run Code Online (Sandbox Code Playgroud)

期望的状态:

docker run -it my_image
(my_env) root@1c32ba066db2:~#
Run Code Online (Sandbox Code Playgroud)

更多信息:

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

当我运行这个时,conda activate my_env似乎运行并成功。但是当我与 交互输入时docker run -it,激活的环境是(base).

此外,我尝试让最后一个命令为CMD conda activate my_env,但它只是运行该命令并且不进入交互模式。

mer*_*erv 8

每个RUN语句(包括docker run)都在新的 shell 中执行,因此不能简单地在命令中激活环境RUN并期望它在后续命令中继续处于活动状态RUN

相反,您需要在 shell 初始化过程中激活环境。该SHELL命令已更改为 include --login,这很棒。现在您只需添加conda activate my_env.profileor .bashrc

...
# Create and activate the environment.
RUN conda env create --force -f environment.yml
RUN echo "conda activate my_env" >> ~/.profile
Run Code Online (Sandbox Code Playgroud)

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

  • 对于交互式容器,在十六种解决方案中,这是最成功的一个。非常感谢! (2认同)