docker镜像转singularity镜像后无法正常使用的一些解决方法;singularity添加环境变量

前言

好久没有写博客了,主要是在上班的时候没啥好写的,不过最近老是遇到docker镜像转singularity镜像后无法正常使用的问题,所以记录一下解决方法。

出现问题的原因

众所周知,docker能够很好的隔离环境并且有良好的迁移能力,但是普通用户可以通过docker轻松获得root权限,所以安全性欠佳。singularity则没有安全性问题,迁移能力更加优秀,但是体感来说环境隔离能力略次与docker,最关键的是singularity用户还是少于docker,导致很多软件只有docker镜像而没有singularity镜像,即使将docker镜像转化为singularity镜像也可能出现镜像不可用的现象。
这是由于在docker镜像制作过程中用到了root权限而没有考虑没有root权限的情况。

解决方法

解决方法根据不同镜像有些许不同,但是原理都差不多。以下方法可以选择在singularity的沙盒中完成;也可以在docker容器中完成后另存为另一个镜像,再转化为singularity镜像;如果是沙盒模式的话需要注意:下面的路径不是从根目录开始而是从沙盒目录开始,不要搞错了然后把服务器搞的一团糟。方法如下:

  1. 有些软件安装路径在/root文件夹中,所以需要开放root文件夹权限,cd / ; chomd 777 root
  2. 复制root用户的配置文件,cp /root/.bashrc /etc/bashrc ; vim /etc/profile #在 /etc/profile文件最下方添加. /etc/bashrc,各位可以选择喜欢的方式;需要确定/etc/bashrc原先不存在。
  3. conda环境配置,复制root用户的conda配置文件/root/.condarc,方法同2。
  4. conda默认环境切换,如果步骤3没有效果可以尝试找到conda环境所在文件夹例如我的py3环境在:/miniconda3/envs/py3/,在/etc/profile文件中写入export PATH=/miniconda3/envs/py3/bin/:$PATH,这样就可以在不启动conda的情况下载入conda环境。

后话

没想到我花了这么久总结的经验写出来才这么几行,一时半会也想不起来更多了,以后又遇到别的情况再补充吧。


2024.5.20 更新

今天在测试singularity镜像时又遇到一个神奇的问题,记录一下怎么在singularity沙盒模式中写入环境变量

碎碎念

配置镜像的时候难免遇到需要写一下环境变量,但是每次用镜像的时候手动export也不方便,所以聪明的各位肯定想到要写到etc/profile里面这样每次启动镜像就能自动加载环境了。但是今天这么干之后发现没有效果,尝试写到/etc/bashrc中,遂测试成功。
疑惑之下进行了一些测试:

  1. 交互模式下 /etc/profile文件在镜像启动的时候根本没有生效,手动source /etc/profile之后才能加载/etc/profile文件中设置的变量;但是/etc/bashrc文件在镜像启动的时候生效了,不需要额外source。
  2. 非交互模式下 两个文件都没有用,可以启动singularity的时候设置参数–env MYPATH="/ssd/01.software/"就可以导入环境变量$MYPATH。
  3. 可以修改类似/.singularity.d/env/90-environment.sh的文件使全局变量生效。
  4. 经过几个小时的不断测试发现非交互模式下运行以下命令只能看到你当前终端上的环境变量,但是看不到容器的环境变量:singularity exec mysingularity.sif /bin/bash -c "echo $MYPATH"
    但是如果你用以下命令就可以看到容器内的环境变量了:singularity exec mysingularity.sif /bin/bash -c "env"

说起来就这几句话其实我也测试了两个多小时,谁让中文论坛根本没人分享这些呢_(:з)∠)_

省流版

运行以下命令你可以看到这个镜像的环境变量放在哪个文件里:
singularity inspect --environment mysingularity.sif
比如我这里显示如下:

=== /.singularity.d/env/10-docker2singularity.sh ===
#!/bin/sh
export PATH="/root/augustus/bin:/root/augustus/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
export DEBIAN_FRONTEND="${DEBIAN_FRONTEND:-"noninteractive"}"
export TZ="${TZ:-"Europe/Berlin"}"

=== /.singularity.d/env/90-environment.sh ===
#!/bin/sh
# Custom environment shell code should follow
export AUGUSTUS_CONFIG_PATH="/augustus_config/"

说明在我的镜像里面,/.singularity.d/env/10-docker2singularity.sh和/.singularity.d/env/90-environment.sh都可以储存环境,随便挑一个文件把你需要的环境写进去就行。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值