如何在 singularity 中运行 conda 命令?

如何在 singularity 中运行 conda 命令?

我想使用 singularity 运行 conda 命令。该命令是:

singularity exec ~/dockerimage.sif conda

它会产生一个错误:

/.singularity.d/actions/exec: 9: exec: conda: Permission denied

这是我的docker文件:

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y apt-utils wget=1.20.3-1ubuntu1 python3.8=3.8.2-1ubuntu1.2 python3-pip=20.0.2-5ubuntu1 python3-yaml=5.3.1-1  git=1:2.25.1-1ubuntu3
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh && chmod +x Miniconda3-py38_4.8.3-Linux-x86_64.sh && ./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b && cp /root/miniconda3/bin/conda /usr/bin/conda
RUN wget https://data.qiime2.org/distro/core/qiime2-2020.8-py36-linux-conda.yml && conda env create -n qiime2-2020.8 --file qiime2-2020.8-py36-linux-conda.yml && conda install -y -n qiime2-2020.8 -c conda-forge -c bioconda -c qiime2 -c defaults q2cli q2template q2-types q2-feature-table q2-metadata vsearch snakemake

我应该在 Dockerfile 中添加什么?它将如何工作?

答案1

好的,从顶部开始,尝试从 Dockerfile 构建映像会导致:

PackagesNotFoundError:当前渠道无法提供以下软件包:

  • q2模板

我将继续假设您要安装q2templates

编写 Dockerfile 时,您应该尽量减少层数并尽可能减小最终图像。

为此,您应该遵循一些规则:

  1. RUN切勿连续使用多条指令。
  2. 始终删除所有缓存、安装程序和其他不必要的文件。
  3. 不要安装非绝对必要的东西。
  4. 不要创建任何文件的相同副本 - 而是使用符号或硬链接。

在您的情况下,所有 4 条规则都被打破了——您RUN连续有 3 条指令,安装了两次 Python 3.8(一次作为系统包,一次使用 Miniconda),安装后没有执行任何清理,并且将conda脚本复制到了另一个目录。

现在我们可以讨论 Docker-Singularity 兼容性。

Docker 容器内的进程默认以用户身份运行root。这意味着$HOME 设置为/root,因此 Miniconda 安装到/root/miniconda3- 换句话说,在 root 的主目录中,只有 root 才能访问,即使其中的文件具有a+rx 权限。

Singularity 容器内部的进程按照用户执行的命令运行singularity

这意味着您必须将 Miniconda 安装在其他位置/root并更改其安装目录的权限以允许每个人都可以访问:

./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b -p /opt/miniconda3
chmod --recursive a+rw /opt/miniconda3

所以最终结果Dockerfile是:

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y \
    apt-utils \
    wget=1.20.3-1ubuntu1 \
    git=1:2.25.1-1ubuntu3 && \
    apt-get clean && \
    rm -rf rm -rf /var/lib/apt/lists/* && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
    chmod +x Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
    ./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b -p /opt/miniconda3 && \
    ln -s /opt/miniconda3/bin/conda /usr/bin/conda && \
    wget https://data.qiime2.org/distro/core/qiime2-2020.8-py36-linux-conda.yml && \
    conda env create -n qiime2-2020.8 --file qiime2-2020.8-py36-linux-conda.yml && \
    conda install -y -n qiime2-2020.8 -c conda-forge -c bioconda -c qiime2 -c defaults q2cli q2templates q2-types q2-feature-table q2-metadata vsearch snakemake && \
    chmod --recursive a+rw /opt/miniconda3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm /qiime2-2020.8-py36-linux-conda.yml && \
    rm /Miniconda3-py38_4.8.3-Linux-x86_64.sh

CMD ["/bin/bash"]

这样你的命令singularity exec ~/dockerimage.sif conda就可以运行并显示 conda 用法了。不幸的是,如果你尝试执行其他一些命令,例如, singularity exec ~/dockerimage.sif conda run python -v你会得到类似这样的错误:

OSError:[Errno 30] 只读文件系统:'/opt/miniconda3/.tmp58csqy_a'

因为除了挂载的目录之外,Singularity 容器是不可变的。

此外singularity exec ~/dockerimage.sif conda activate qiime2-2020.8还会失败:

CommandNotFoundError:您的 shell 未正确配置为使用“conda activate”。要初始化您的 shell,请运行

$ conda init <SHELL_NAME>

目前支持的 shell 有:

  • 狂欢
  • tcsh
  • 迅捷
  • 电源外壳

查看“conda init --help”了解更多信息和选项。

重要提示:运行“conda init”后,您可能需要关闭并重新启动 shell。

即使您已经正确修改了您的 shell(使用 Bash 测试)。

我设法让它工作的唯一方法是运行:

singularity shell ~/dockerimage.sif

然后在容器内

conda init # Modifies .bashrc on your host machine
source .bashrc # Loads modified .bashrc
export LC_ALL=C.UTF-8 # Sets locale to UTF-8
export LANG=C.UTF-8 # Sets locale to UTF-8
conda activate qiime2-2020.8 # Activates the environment

链接:

GitHub 上的 Dockerfile Docker Hub 上的镜像(使用标签latest,其他标签可能不起作用)

答案2

你可以看看这个文件看看我在构建时如何运行 conda,这是包装脚本关于如何在运行时使用 conda。

此外,截至 2020 年 11 月撰写本文时,conda activate <env_name>是一个错误命令。更好的命令是source activate <env_name>。我不得不研究源代码才能弄清楚。

答案3

conda.sh我认为(在 Singularity 中)这是一个在容器内找到路径并在脚本末尾运行它的问题%post

就像是:

%post
    . /opt/conda/etc/profile.d/mamba.sh # finding the path of the conda env 

相关内容