如何检查进程是否在 Docker 容器中运行(cgroup v2 Linux 主机)

9
如何检查Docker容器内的进程是否正在运行?我需要一种可靠且具有未来性的方法。
这个问题已经在如何确定进程是否在lxc / Docker中运行?中得到了回答,但是答案已经过时,似乎在最近的设置(启用cgroups v2的Linux主机,Docker 20.10.x,内核5.10.x)上不起作用。
链接上面排名最高的答案建议检查/proc/1/cgroup中的字符串docker,但是以下是我的结果:
# cat /proc/1/cgroup 
0::/

似乎是因为我的主机启用了cgroups v2(它曾经可以使用cgroups v1)。
另一个答案建议检查文件/.dockerenv的存在。它有效。
# test -e /.dockerenv && echo ok
ok

然而,Docker维护者的评论(日期为2016年)建议不要依赖这个文件来传递容器环境变量(强调是我的)。原本“.dockerenv”用于在容器边界上跨容器传输环境变量。我不建议依赖它的存在(如果我没记错的话,你链接的代码是它仍然存在的唯一原因)。/sys/fs/cgroup里可能有一些可疑的东西,但我最近没有检查过。

-- https://github.com/moby/moby/issues/18355#issuecomment-220484748

那么,有比这更好的方法吗?Docker维护者的回答将非常受欢迎。谢谢!

我有完全相同的问题。你找到任何解决方案了吗? - user3142747
只是为了确认,您想检查进程是否运行Docker容器中还是从内部运行,因为这是两个非常不同的事情。 - Rick Rackow
1个回答

0
如果proc/1/cgroup是 /,那么你基本上可以保证你在一个类似容器的系统中(但请注意,如果cgroupns=host,你将在容器中获得主机视图,因此一定要检查这种情况)。在大多数Linux操作系统中,systemd是init系统,所以/proc/1/cgroup将是/init.scope,因此如果它不等于/init.scope,你可能处于某种类型的容器中,我认为这对于cgroupns=private和cgroupns=host也适用。编辑:在一个有systemd作为init的--priviliged容器中进行了测试,并且cgroupns=private,这也会显示为/init.scope,不幸的是,因此只检查/proc/1/cgroup似乎只是最好的猜测。然而,我相信只有主机级别的/sys/fs/cgroup.procs允许包含进程,任何其他容器在容器中时都应该将/sys/fs/cgroup.procs包含0条目。因此,似乎检查/sys/fs/cgroup.procs是否为空->容器,如果不为空,你仍然可以是cgroupns=host,但在这种情况下,你可以检查/proc/1/cgroup是否在容器路径中。编辑2:根据https://systemd.io/CONTAINER_INTERFACE/:如果你编写想要检测自己是否在容器中运行的软件,请检查/proc/1/environ并查找container=环境变量。这需要root权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接