我正在尝试将 Snakemake 与 Singularity 结合起来,并且我注意到awk在使用 Singularity 时一个简单的命令不再起作用。在$1最后一行被取代的bash,而不是被用来作为第一个字段awk。
这是一个最小的工作示例(Snakefile):
singularity: "docker://debian:stretch"
rule all:
input: "test.txt"
rule test:
output:
"test.txt"
shell:
"cat /etc/passwd | awk -F':' '{{print $1}}' > {output}"
Run Code Online (Sandbox Code Playgroud)
当我在snakemake没有奇点的情况下运行时,输出test.txt看起来如预期(仅包含用户名)。当我运行时snakemake --use-singularity,文件包含整行,例如root:x:0:0:root:/root:/bin/bash.
这是 Snakemake 的日志:
$ snakemake --use-singularity --printshellcmd
Building DAG of jobs...
Using shell: /usr/bin/bash
Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
count jobs
1 all
1 test
2 …Run Code Online (Sandbox Code Playgroud) 我正在使用 Singularity 容器来运行来自 Nextflow 工作流管理系统的命令。我在 Singularity 中有一个 conda 环境,当我进入容器时可以激活它
singularity pull shub://brucemoran/Singularity:pcgr.centos7
singularity shell brucemoran-Singularity-pcgr.centos7.img
#<inside container>
source activate pcgr
Run Code Online (Sandbox Code Playgroud)
当 Nextflow 执行时,我已经定义了source activate pcgr我认为应该激活 conda env 的位置。但我收到unbound variable HOST警告。我认为这与未激活和随后使用变量有关,如果环境已激活,则应定义这些变量(?)。
我希望容器在执行时激活 env (pcgr)。我尝试过
%run
source activate pcgr
Run Code Online (Sandbox Code Playgroud)
和
%post
source activate pcgr
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用
singularity exec pcgr.img which pcgr.py
which: no pcgr.py in ...
Run Code Online (Sandbox Code Playgroud)
我看不出这是如何完成的,但假设这很容易,而且我严重忽略了一些事情!
帮助表示赞赏。
我有以下奇点容器配方:
#!/bin/bash
Bootstrap: docker
From: nipype/nipype:latest
%labels
Version v1.0
%post
# Install nano
apt-get update
apt-get install nano
# Set up Python environment
CONDA_ENV=/opt/conda/bin
export PATH=$CONDA_ENV:$PATH
chmod -R 777 $CONDA_ENV
# Activate conda environment
conda activate neuro
conda install seaborn
pip install pybids
Run Code Online (Sandbox Code Playgroud)
我用 Singularity 构建容器,如下所示:
sudo singularity build swish.simg Singularity.swish
依赖项的安装和大部分构建都进展顺利,直到我遇到错误source not found。重申一下这个问题和我所尝试过的:
我开始学习奇点以对科学管道进行可重复的分析。一位同事解释说,图像用于实例化容器。然而,在阅读文档和教程时,也使用了该术语,并且和instance的用法似乎有些可以互换。因此,我不确定我是否准确理解了图像、容器和实例之间的区别。我确实知道菜谱是用于构建其中一个的文本文件(我认为是图像?)。imagecontainer
例如,在此页面上解释:
现在我们可以将定义文件构建成图像!只需运行一下
build,图像就可以使用了:Run Code Online (Sandbox Code Playgroud)$ sudo singularity build url-to-pdf-api.img Singularity
好的,所以这使用配方Singularity来构建图像,并具有.img. 但是,该build命令的帮助说明指出:
$ 奇点帮助构建
用法:奇点 [...] 构建 [构建选项...]
构建命令根据配方(定义文件)或基于 URI、位置或存档来编译容器。
那么这似乎表明我们正在构建一个容器?
然后,还有image和instance子命令。
所有这些术语都可以互换使用吗?似乎有时它们是这样,有时它们之间又存在差异。
我正在尝试学习奇点,所以我从他们的库中提取了这个例子:
singularity pull library://sylabsed/examples/lolcow
Run Code Online (Sandbox Code Playgroud)
拉出后,我想检查该图像内的目录是什么,以及是否有任何用于构建图像的定义文件,因此我通过构建一个进入开发模式sandbox:
sudo singularity build --sandbox lowcow/ library://sylabsed/examples/lolcow
Run Code Online (Sandbox Code Playgroud)
检查目录后,lowcow/我没有找到任何奇点.def定义文件。
有人可以向我解释一下是否可以在 中找到定义文件吗sandbox?
我正在尝试使用该命令构建一个可写奇点容器sudo singularity build --writable my_container.img docker://image_name,但出现错误Error for command "build": unknown flag: --writable。
我决定遵循 Singularity(此处)的指南,看看是否能找到我的问题。我正在使用该命令sudo singularity build --writable lolcow.img shub://GodloveD/lolcow,但遇到了同样的错误Error for command "build": unknown flag: --writable。
我使用的是奇点版本 3.6.4。
有人知道会发生什么吗?
我有一个关于 docker 和奇点的非常基本的问题。我希望能够使用 docker 和奇异性来运行 docker 容器,但我对工作目录之间的差异感到困惑。这是一个示例:在我的 docker 容器内,我有main.sh和test.sh。
内容main.sh:
#!/bin/bash
echo "Executing main.sh"
./test.sh
Run Code Online (Sandbox Code Playgroud)
内容test.sh:
#!/bin/bash
echo "Executing test.sh"
Run Code Online (Sandbox Code Playgroud)
当执行以下命令时:
sudo docker run -t myuser/mydocker:1.0 ./main.sh
我得到预期的输出:
Executing main.sh
Executing test.sh
Run Code Online (Sandbox Code Playgroud)
但是执行时singularity exec -e docker://myuser/mydocker:1.0 /main.sh
我收到此错误:
Executing main.sh
/main.sh: line 4: ./test.sh: No such file or directory
Run Code Online (Sandbox Code Playgroud)
为什么test.sh无法访问?有没有办法让它通过奇点而不改变 的内容main.sh?我的奇点版本是3.6.3。
谢谢你!
当我在 Singularity 容器内运行特定的 ImageMagick 转换命令(以生成动画 GIF)时,它始终给出内存错误:
\nconvert-im6.q16: cache resources exhausted `foo.gif' @ error/cache.c/OpenPixelCache/4083.\nconvert-im6.q16: memory allocation failed `foo.gif' @ error/quantize.c/AssignImageColors/496.\nRun Code Online (Sandbox Code Playgroud)\n我该如何调试这个?
\n我在 Singularity 之外没有遇到任何内存问题,这给我的印象是 Singularity 人为地限制了我的可用内存,或者 ImageMagick 在 Singularity 内部配置不当。我没有看到在 Singularity 中运行的任何其他应用程序出现内存问题,这让我认为这是 ImageMagick 问题。
\n以下是有关我的系统的一些详细信息:
\n$ singularity --version\nsingularity version 3.7.1-1.el8\nRun Code Online (Sandbox Code Playgroud)\n容器内部:
\nSingularity> convert --version\nVersion: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org\nCopyright: \xc2\xa9 1999-2019 ImageMagick Studio LLC\nLicense: https://imagemagick.org/script/license.php\nFeatures: Cipher DPC Modules OpenMP \nDelegates (built-in): bzlib djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma …Run Code Online (Sandbox Code Playgroud) 我安装了奇点。在我的存储库中,我有 Dockerfile。我想从该 Dockerfile 创建一个 SIF(奇点图像)。我尝试查看文档并检查docker build选项,但它不包含 Dockerfile 的选项。是否可以从 Dockerfile 创建 SIF 映像?就像是:
Singularity build test.sif Dockerfile
Run Code Online (Sandbox Code Playgroud) R 志愿者目前维护 R ~3.5 和 ~4.0 的 Ubuntu 软件包存储库。对于仿生海狸,这些是:
我正在构建单独的 Singularity 容器,我需要在其中安装非常特定版本的 R;这些存储库似乎提供了这些内容。具体来说,我希望构建包含 R 版本 3.6.1、4.0.3 和 4.1.0 的容器;每个版本一个容器。
我在容器构建脚本中执行此操作,首先添加适当的 Apt 源,然后使用固定版本运行安装。我注意到,只有使用包存储库中列出的精确版本号并且包含r-recommended在同一版本中,我才能让它运行。例如,对于 R 3.6.1:
apt install -y r-base=3.6.1-3bionic r-recommended=3.6.1-3bionic
Run Code Online (Sandbox Code Playgroud)
这将正确安装r-base并r-recommended在给定的版本上。然而,当我运行容器化 R 时,R 实际上报告自己处于这些存储库提供的最新版本(分别为 3.6.3、4.1.0 和 4.1.0)。据推测,如果r-base是正确的,这甚至可能表明它们处于破碎状态。
查看 Apt 的输出,很明显许多其他r-*软件包默认为最新版本,而不是我指定的版本。为了解决这个问题,我尝试在所有默认为最新版本的包上显式设置版本。再次以 R 3.6.1 为例:
apt install -y r-base=3.6.1-3bionic \
r-base-core=3.6.1-3bionic \
r-base-dev=3.6.1-3bionic \
r-base-html=3.6.1-3bionic \
r-doc-html=3.6.1-3bionic \
r-recommended=3.6.1-3bionic
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用,抱怨与它尝试安装的其他包(r-cran-*packages,IIRC)发生冲突。
我不知道这是 Apt 的东西、R 的东西还是与他们的存储库有关的东西。有没有办法可以从官方来源安装这些特定版本,而无需自己构建任何东西?(如果不是,他们将旧版本保留在存储库中有何意义?)
我正在尝试在 HPC 集群上启动奇点容器。我一直在本地运行projectNetv2.sif 和沙箱,没有任何问题。将它们导出到 HPC 后,出现以下错误。
(singularity) [me@hpc Project]$ ls
examples projectnet_image_v2.tar.gz projectnet_sandboxv2 projectNetv2.sif
(singularity) [me@hpc Project]$ singularity run projectNetv2.sif
INFO: Converting SIF file to temporary sandbox...
FATAL: while extracting SimNetv21.sif: root filesystem extraction failed: extract command failed: ERROR : Failed to create user namespace: user namespace disabled
: exit status 1
##Attempting to run sandbox
(singularity) [me@hpc Project]$ singularity run projectnet_sandboxv2/
ERROR : Failed to create user namespace: user namespace disabled
Run Code Online (Sandbox Code Playgroud)
谁能建议我如何启用用户命名空间?或者在没有用户名空间的情况下运行 sif,因为我没有 sudo 权限。
我正在寻找优化奇点 HPC 容器构建时间的方法。我知道通过逐层构建它们可以节省一些时间。但仍然有优化的空间。
我感兴趣的是使用/缓存主机系统上有意义的任何内容。
我做了一些实验,但在任何一点上都没有成功。
到目前为止我发现了什么:
缓存
我在容器中安装 ccache 并指示构建系统使用它。我知道因为我正在使用singularity buildsudo 运行,所以缓存将位于/root. 但运行构建后,/root/.ccache却是空的。我验证了生成的 CMake 构建文件,它们肯定使用了 ccache。
我什至创建了一个测试配方,其中包含%post
touch "$HOME/.ccache/test"
Run Code Online (Sandbox Code Playgroud)
但测试文件没有出现在主机系统上的任何地方(不在/root我用户的家中)。构建步骤是否挂载容器支持的目录而/root不是主机的根目录?
使用 ccache 还需要做些什么吗?
git
人们建议运行例如 git-cache-http-server (/sf/answers/3055053571/)并使用git config --global url."http://gitcache:1234/".insteadOf https://.
由于奇点可以读取主机文件系统的部分内容,我认为甚至可以有一种方法让它在没有代理程序的情况下工作。但是,如果主机 git 存储库不在$HOMEor内部/tmp,奇点如何在构建期间访问它们?singularity build没有--bind标志来指定其他安装目录。使用%files配方中的部分听起来效率很低 - 每次运行构建时都要复制所有内容。
易于
人们建议使用例如squid-deb-proxy(https://gist.github.com/dergachev/8441335)。同样,由于奇点能够读取主机文件系统文件,我想只利用主机的/var/cache/apt. 但/var默认情况下并没有挂载到容器上。/var/cache/apt那么同样的问题又来了——如何在容器构建期间挂载。总体而言这是一个好主意吗?鉴于主机和容器都基于相同版本的 …