docker 运行 与已激活的 conda 环境交互
docker run interactive with conda environment already activated
我想创建一个 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
,但它只是 运行 并且没有进入交互模式。
每个 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 添加的部分之后。
我的 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 环境的名称。
我想创建一个 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
,但它只是 运行 并且没有进入交互模式。
每个 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 添加的部分之后。
我的 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 环境的名称。