介紹
在 Singularity 中運行容器,當容器退出時,對容器做的修改均會丟失,那怎麼保存對容器的修改呢?此時我們可以通過 Singularity 的 Overlay 實現。
Singularity 的 Overlay 其實就是一個目錄或文件系統鏡像,其中保存着對基於基礎鏡像的修改,可以使用 --overlay 選項來使用,且應用在下面幾個容器命令上:
- run
- exec
- shell
- instance.start
使用
首先,先獲取一個基礎鏡像,比如:centos,獲取後會下載一個 centos.sif 文件。
$ singularity pull centos
創建一個目錄作爲 Overlay 目錄。
$ mkdir my_overlay
然後使用 --overlay 選項運行容器,由於安全原因,使用 --overlay 必須要具有 root 權限,所以可以使用 sudo 來運行。
$ sudo singularity shell --overlay my_overlay centos.sif
# 先在容器裏檢查是否有zip工具,默認容器會找不到命令。
Singularity centos.sif:/home/data/singularity-study> zip
bash: zip: command not found
# 安裝一下zip包
Singularity centos.sif:/home/data/singularity-study> yum install -y zip
...
# 安裝完檢查一下zip工具安裝路徑
Singularity centos.sif:/home/data/singularity-study> whereis zip
zip: /usr/bin/zip
然後退出容器,並使用下面命令再次運行容器,就會發現剛纔安裝的工具已經在容器中了。
$ sudo singularity shell --overlay my_overlay centos.sif
# 然後直接檢查zip工具安裝路徑
Singularity centos.sif:/home/data/singularity-study> whereis zip
zip: /usr/bin/zip
如果我們使用下面的命令運行容器,就不會使用我們上面創建的 Overlay。
$ sudo singularity shell centos.sif
# 容器會找不到zip命令
Singularity centos.sif:/home/data/singularity-study> zip
bash: zip: command not found
最後說一下,對於使用 Overlay 的持久化的容器,我們無法根據 Overlay 目錄來創建鏡像。比如:如果我使用下面的命令來創建鏡像
$ sudo singularity build my_overlay.sif my_overlay
INFO: Starting build...
INFO: Creating SIF file...
INFO: Build complete: my_overlay.sif
創建鏡像後,我們使用此鏡像來創建容器,此時會提示運行報錯。
$ singularity shell my_overlay.sif
WARNING: passwd file doesn't exist in container, not updating
WARNING: group file doesn't exist in container, not updating
FATAL: exec /.singularity.d/actions/shell failed: no such file or directory