【问题标题】:Activate conda environment in singularity container from dockerfile从 dockerfile 激活奇异容器中的 conda 环境
【发布时间】:2019-08-08 15:57:10
【问题描述】:

我正在尝试从现有的 docker 映像设置一个奇异容器,在该容器中,只要我运行容器,就会激活名为“tensorflow”的 conda 环境。我找到了关于这个主题的一些答案here。不幸的是,在这篇文章中,他们只解释了如何设置奇异 .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”环境。但是,我宁愿在运行奇异容器时激活“张量流”环境。

如何修改我的 Dockerfile,以便在同时运行 docker 容器和奇异容器时,默认环境是“tensorflow”?

非常感谢您的帮助!

【问题讨论】:

    标签: python docker conda singularity-container


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的回答。我还有两个后续问题:1.) 当我选择您推荐的 BASH_ENV 解决方案并尝试从奇异容器中执行 python 脚本时,我是否必须运行 singularity run opensuse_conda.sif bash -c "python test.py" 以确保“tensorflow”环境被激活了?对我来说这是可行的,但我想知道我是否真的必须使用 bash -c 命令。
    • 2.) 你说 .bashrc 文件只有在我启动交互式 shell 时才会被读取。当我运行docker run -it <image> /bin/bash 时,这是真的。正如预期的那样,我得到了一个“tensorflow”环境处于活动状态的交互式会话。但是,运行singularity run <image>.sif /bin/bash 会产生一个交互式会话,而没有任何环境处于活动状态。我首先必须输入conda activate tensorflow 才能进入我的自定义环境。这是为什么?启动交互式奇点容器会话时,似乎未读取我在 Dockerfile 中创建的 .bashrc 文件。
    • Singularity 默认使用--norc 和自定义$PS1 运行,这样你就知道你在一个singularity 图像而不是主机中。当您使用bash -c ... 作为运行命令时,您绕过了通常使用--norc 的地方,这就是为什么您的运行环境与您期望的一样。
    • 嗨@Constih,想知道您是否找到了一种无需使用bash -c ...就能自动激活环境的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多