我想使用 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 时,您应该尽量减少层数并尽可能减小最终图像。
为此,您应该遵循一些规则:
RUN
切勿连续使用多条指令。- 始终删除所有缓存、安装程序和其他不必要的文件。
- 不要安装非绝对必要的东西。
- 不要创建任何文件的相同副本 - 而是使用符号或硬链接。
在您的情况下,所有 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
答案3
conda.sh
我认为(在 Singularity 中)这是一个在容器内找到路径并在脚本末尾运行它的问题%post
。
就像是:
%post
. /opt/conda/etc/profile.d/mamba.sh # finding the path of the conda env