奇点沙箱文件管理

Singularity sandbox file management

厌倦了与 lib install/dependencies 问题作斗争,我开始使用 Singularity。 虽然,我不确定我是否准确理解沙盒模式下文件管理(不是数据、程序)的工作原理。 例如,我设计了一个非常简单的定义文件,它只是一个“裸”Debian:

Bootstrap: library
From: debian

%post
apt-get update

我用它创建了一个沙箱来添加东西:

sudo singularity build --sandbox Test/ naked_Debian.def

然后我尝试安装一个程序。但我不明白的是我设法做到了,删除了沙箱目录,但我认为仍然有在沙箱生命周期中创建的文件(在 /dev、/运行、/root 等中)。 ).例如,我从 git 克隆的程序现在位于本地的 /root 中(独立于任何容器)。 据我了解,所有内容都在容器中,如果我删除沙箱目录,它们应该会消失。否则,我会在所有测试中留下很多乱七八糟的东西吗?然后我无法将容器从系统移植到另一个系统。

如果我创建任何新的沙箱目录,程序已经存在。

干杯, 马修

默认情况下,singularity 将 $HOME 挂载到容器并使用该路径作为 singularity shell / exec 的工作目录。由于您是 运行 带 sudo 的沙箱,因此 /root 正在安装,如果您没有 cd 到不同的目录,那么您克隆的任何存储库都会在那里结束。 /tmp 也会自动挂载,不过这不太可能导致问题,因为它只是临时文件。

您有几个选项可以避免文件在您意想不到的地方结束。

  1. 禁用 home 的自动挂载:singularity shell --no-home ...
    • 默认工作目录现在是 / 而不是 $HOME 并且文件是直接在沙箱中创建的(而不是挂载在目录中)
    • 如果你想从沙盒中取出文件,你要么需要复制到容器内的/tmp,要么在主机OS上从/tmp复制到所需位置
  2. 设置一个不同的位置作为家:singularity shell --home $PWD ...
    • 这将挂载并使用当前目录作为 $HOME 而不是主机 OS
    • 上用户的 $HOME
    • 在主机 OS 和容器之间移动文件更简单,但仍会在主机 OS
    • 中创建文件
  3. 根本不要挂载系统目录:singularity shell --contain --workdir /some/dir ...
    • /tmp/var/tmp 的目录是在 /some/dir 中创建的,而不是在主机上使用 /tmp/var/tmp$HOME与宿主机同路径,作为工作目录,但为空,与宿主机分开OS
    • 与主机 OS 完全分离,同时仍允许容器与 OS
    • 之间进行一些访问

有关这些选项的更多详细信息 can be found in the documentation