elb*_*ero 9 linux cgroups docker
如何检查进程是否正在 Docker 容器内运行?我想要一种可靠且面向未来的方法。
这个问题已经在如何确定进程是否在 lxc/Docker 中运行?,但是答案相当旧,并且它似乎不适用于最近的设置(启用了 cgroups v2 的 Linux 主机、Docker 20.10.x、内核 5.10.x)。
评价最高的答案(来自上面的链接)建议检查docker
中的字符串/proc/1/cgroup
,但是这是我得到的:
# cat /proc/1/cgroup
0::/
Run Code Online (Sandbox Code Playgroud)
这似乎是因为我的主机上启用了 cgroups v2(它曾经与 cgroups v1 一起使用)。
另一个答案建议检查该文件是否存在/.dockerenv
。有用:
# test -e /.dockerenv && echo ok
ok
Run Code Online (Sandbox Code Playgroud)
然而,Docker 维护者的评论(日期为 2016 年)建议不要依赖此文件(强调我的):
最初,“.dockerenv”用于跨容器边界传输容器的环境变量——我也不建议依赖它的存在(IIRC,您链接到的代码是它仍然存在的唯一原因)。/sys/fs/cgroup 内可能有一些有罪的东西,但我最近没有检查过。
-- https://github.com/moby/moby/issues/18355#issuecomment-220484748
那么还有比这更好的方法吗?非常欢迎 Docker 维护者的回答。谢谢!
如果 proc/1/cgroup 是 / ,那么您基本上可以保证处于类似容器的系统中(但是请注意,如果 cgroupns=host ,您将在容器中获得主机视图,因此也请务必检查这种情况)。在大多数Linux操作系统中,systemd是init系统,所以/proc/1/cgroup将是/init.scope,所以如果它不等于/init.scope,你可能位于某种容器中,我相信这应该可以工作对于 cgroupns=private 以及 cgroupns=host。编辑:在一个 --priviliged 容器中进行测试,以 systemd 作为 init,并且 cgroupns=private,不幸的是,这也会显示为 /init.scope,但是,仅检查 /proc/1/cgroup 似乎只是最好的-努力猜测。但是我相信只有主机级 /sys/fs/cgroup.procs 才允许包含 procs,任何其他容器在容器中时都应该让 /sys/fs/cgroup.procs 包含 0 个条目。因此,似乎检查 /sys/fs/cgroup.procs 是否为空 -> 容器,如果它不为空,您仍然可以 cgroupns=host,但在这种情况下,您可以检查 /proc/1/cgroup 是否在容器路径中。Edit2:根据https://systemd.io/CONTAINER_INTERFACE/:如果您编写的软件想要检测它是否在容器中运行,请检查/proc/1/environ并查找container=环境变量。这确实需要 root。
归档时间: |
|
查看次数: |
1508 次 |
最近记录: |