无需root/fakeroot,让任意非特权用户运行Singularity版pwiz容器的通用方法
我尝试通过Singularity运行一个Docker容器,该容器借助Wine执行Windows程序(ProteoWizard的msconvert),使用的镜像地址为chambm/pwiz-skyline-i-agree-to-the-vendor-licenses。容器内的Wine安装目录归root所有,普通用户执行命令:
singularity run --env WINEDEBUG=-all pwiz.sif wine msconvert
时会报错:
wine: '/wineprefix64' is not owned by you
原本可以用--fakeroot选项解决,但目标远程HPC系统管理员禁用了该选项,报错:
FATAL: while extracting pwiz.sif: root filesystem extraction failed: extract command failed: FATAL: configuration disallows users from running sandbox based containers
我目前的临时方案是在构建容器时添加%post段,将/wineprefix64目录所有权改为远程系统指定用户(UID 1234),并在有root权限的机器上重新构建Singularity镜像,配置如下:
Bootstrap: docker From: chambm/pwiz-skyline-i-agree-to-the-vendor-licenses %post useradd -u 1234 user chown -Rf --no-preserve-root user /wineprefix64
这个方案对我有效,但想找更通用的方法,不用为每个用户手动重构镜像,让任意非特权用户都能正常运行该容器。
以下几种方法无需为每个用户重构镜像,即可让任意非特权用户运行该容器:
1. 自定义WINEPREFIX到用户可写目录
Wine默认使用/wineprefix64作为前缀目录,直接指定用户本地可写目录作为新的WINEPREFIX,绕过原目录权限限制:
# 创建本地用户可写的wine前缀目录 mkdir -p ~/my_wineprefix # 运行容器时指定WINEPREFIX环境变量 singularity run --env WINEDEBUG=-all --env WINEPREFIX=$HOME/my_wineprefix pwiz.sif wine msconvert
首次运行时Wine会自动初始化该目录,后续运行即可正常使用。
2. 绑定本地可写目录覆盖容器内的/wineprefix64
用Singularity的--bind选项,将用户本地可写目录映射到容器内的/wineprefix64,替换原root所有的目录:
# 创建本地对应目录 mkdir -p ~/wineprefix64 # 绑定目录并运行容器 singularity run --env WINEDEBUG=-all --bind $HOME/wineprefix64:/wineprefix64 pwiz.sif wine msconvert
3. 构建一次通用镜像(全局可写权限)
如果能在有root权限的机器上构建一次镜像,可将/wineprefix64设置为全局可写,适配所有用户:
Bootstrap: docker From: chambm/pwiz-skyline-i-agree-to-the-vendor-licenses %post chmod -R 777 /wineprefix64
注意:这种方式会降低目录安全性,仅在可信环境中使用。
4. 以容器内通用非root用户身份运行
如果容器内存在nobody这类通用非root用户,尝试用该用户身份运行容器:
singularity run --env WINEDEBUG=-all --user nobody pwiz.sif wine msconvert
需确保nobody用户对/wineprefix64有读写权限,若没有可在镜像构建时提前添加权限。
内容的提问来源于stack exchange,提问作者rhacker007

