从 dockerfile 激活奇点容器中的 conda 环境

Activate conda environment in singularity container from dockerfile

我正在尝试从现有 docker 图像设置一个奇点容器,其中一个名为 "tensorflow" 的 conda 环境在我 运行 容器后立即被激活。我找到了关于这个主题的一些答案 。不幸的是,在此 post 中,他们仅解释了如何设置 singularity .def 文件以默认激活 conda 环境。但是,我只想修改我现有的 Dockerfile,然后从中构建一个奇点图像。

到目前为止我尝试过的是像这样设置 Dockerfile:

FROM opensuse/tumbleweed

ENV PATH /opt/conda/bin:$PATH
ENV PATH /opt/conda/envs/tensorflow/bin:$PATH

# Add conda environment files (.yml)
COPY ["./conda_environments/", "."]

# Install with zypper
RUN zypper install -y sudo wget bzip2 vim tree which util-linux

# Get installation file
RUN wget --quiet https://repo.anaconda.com/archive/Anaconda3-2019.07-Linux-x86_64.sh -O ~/anaconda.sh

# Install anaconda at /opt/conda
RUN /bin/bash ~/anaconda.sh -b -p "/opt/conda"

# Remove installation file
RUN rm ~/anaconda.sh

# Make conda command available to all users
RUN ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh

# Create tensorflow environment
RUN conda env create -f tensorflow.yml

# Activate conda environment with interactive bash session
RUN echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc
RUN echo "conda activate tensorflow" >> ~/.bashrc

# Default command
CMD ["/bin/bash"]

构建 docker 图像后,我 运行 docker 容器具有:

docker run -t -d --rm --name=my_container opensuse_conda:latest

然后进入容器:

docker exec -it my_container bash

结果符合预期。 shell 会话直接启动,"tensorflow" 环境处于活动状态,由 (tensorflow) 前缀指示。

要从这张 docker 图像构建奇点图像,我使用:

sudo singularity build opensuse_conda.sif docker-daemon://opensuse_conda:latest

和运行容器:

sudo singularity run opensuse_conda.sif

这就是问题所在。默认激活 "base" 环境而不是 "tensorflow" 环境。但是,我宁愿在 运行 奇点容器时激活 "tensorflow" 环境。

我如何修改我的 Dockerfile,以便在 运行 同时连接 docker 容器和奇点容器时,默认环境是 "tensorflow"?

非常感谢您的帮助!

您的问题是 .bashrc 仅在您启动交互式 shell 时才会被读取,但当容器是 运行 默认命令时则不会。有关背景信息,请参阅 this answer

有一堆 bash startup files 可以代替 conda activate tensorflow 命令。我建议定义一个您自己的文件,并将文件名放入 BASH_ENV 环境变量中。两者都可以从 Dockerfile 轻松完成。