我想运行一个带有奇点的 conda 命令。命令是:
singularity exec ~/dockerimage.sif conda
它产生一个错误:
/.singularity.d/actions/exec: 9: exec: conda: Permission denied
这是我的码头文件:
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 中添加什么?它将如何运作?
好的,从顶部开始,尝试从 Dockerfile 构建映像会导致:
我将继续假设您打算安装
q2templates
.在编写 Dockerfile 时,您应该以尽可能少的层数和尽可能小的最终图像为目标。
为此,您应该遵循一些规则:
RUN
一个接一个地使用多个指令。在您的情况下,所有 4 条规则都被打破 - 您有 3
RUN
条指令一个接一个,安装 Python 3.8 两次(一次作为系统包,一次使用 Miniconda),安装后不执行任何清理并将脚本复制conda
到另一个目录。现在我们可以讨论 Docker-Singularity 的兼容性。
Docker 容器内的进程默认以 user 身份运行
root
。这意味着$HOME
设置为/root
,因此 Miniconda 安装到/root/miniconda3
- 换句话说,在 root 的主目录中,只有 root 可以访问,即使里面的文件有a+rx
权限。Singularity 容器内的进程作为用户执行的命令运行
singularity
。这意味着您必须在其他地方安装 Miniconda
/root
并更改其安装目录的权限以允许每个人都可以访问:所以决赛
Dockerfile
是:这样您
singularity exec ~/dockerimage.sif conda
就可以工作并显示 conda 的使用情况。不幸的是,如果您尝试执行其他一些命令,例如。singularity exec ~/dockerimage.sif conda run python -v
您将收到类似于以下内容的错误:因为 Singularity 容器是不可变的,除了挂载的目录。
此外
singularity exec ~/dockerimage.sif conda activate qiime2-2020.8
将失败:即使您已正确修改设置您的外壳(用 Bash 测试)。
我设法使它工作的唯一方法是运行:
然后在容器内
链接:
GitHub 上的 Dockerfile Docker Hub上的图像(使用 tag
latest
,其他可能不起作用)您可以查看此文件以了解我在构建期间如何运行 conda,以及有关我在运行期间如何使用 conda 的包装脚本。
在 2020 年 11 月撰写本文时,还有更多
conda activate <env_name>
信息是错误的命令。更好的命令是source activate <env_name>
. 我必须查看源代码才能弄清楚。