如何测试 buildah 脚本是否在 buildah-unshare 下运行?

如何测试 buildah 脚本是否在 buildah-unshare 下运行?

如果我有一个使用buildah mount.我使用文档指定的相同方式,

mnt=$(buildah mount $ctr)

如果我调用我的脚本sh ./build.sh,我会得到

无法在无根模式下使用驱动程序覆盖进行安装。您需要在buildah unshare会话中运行它

问题是如果此处发生故障,脚本不会终止。我可以通过测试来检查它if [-z $mnt]; then echo "Run with buildah-unshare; exit; fi,但这并不理想,因为那样我仍然有buildah from我在无谓地做事的先验。

如果您尝试支持无根 buildah,有没有办法确保您在 下运行 buildah buildah unshare

答案1

一种方法是确保 root 用户已映射到某个用户。如果您cat /proc/self/uid_map在主用户名空间上运行,您将看到 uid=0 被映射到 0,表示所有用户的长度4294967295。这是一个虚拟映射(请参阅 参考资料man namespaces获取更多信息)。

$ cat /proc/self/uid_map
0          0 4294967295

如果该虚拟映射是不是在该文件中,您位于子用户命名空间中。

# If we find the dummy line, error and exit
grep -lE '^\s+0\s+0' /proc/self/uid_map       \
  && echo "Please run under buildah unshare"  \
  && exit

答案2

在当前的 buildah 版本中,buildah mount如果不运行用户命名空间,就会崩溃。

$ buildah mount
cannot mount using driver overlay in rootless mode. You need to run it in a `buildah unshare` session
$ echo $?
125
$ buildah -v
buildah version 1.17.0-dev (image-spec 1.0.1-dev, runtime-spec 1.0.2-dev)

相关内容