【问题标题】:docker run interactive with conda environment already activateddocker run 与 conda 环境交互已激活
【发布时间】:2020-10-12 18:39:34
【问题描述】:

我想创建一个 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 中,我包含了安装 conda、创建环境和激活环境所需的所有 RUN 命令。相关部分转载如下。

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,但它只是运行该命令并没有进入交互模式。

【问题讨论】:

    标签: docker dockerfile conda


    【解决方案1】:

    每个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 添加的部分之后。

    【讨论】:

    • 对于交互式容器,在 16 种不计其数的解决方案中,这是最成功的一个。非常感谢!
    【解决方案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 环境的名称。

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多