如何检查进程是否在Docker容器中运行?我想要一种可靠的方法,而且是面向未来的。
这个问题已经在How to determine if a process runs inside lxc/Docker?上得到了回答,但是答案已经很老了,而且在最近的设置上似乎不起作用(启用了cgroups v2的Linux主机,Docker 20.10.x,内核5.10.x)。
最高评级的答案(来自上面的链接)建议检查/proc/1/cgroup
中的字符串docker
,但我得到了以下结果:
# cat /proc/1/cgroup
0::/
这似乎是由于cgroups v2 is enabled on my host(它曾经与cgroups v1一起工作)。
另一个答案建议检查文件/.dockerenv
是否存在。它的工作原理:
# test -e /.dockerenv && echo ok
ok
然而,Docker的维护者的评论(日期为2016年)建议不要依赖此文件(强调我的):
最初,“.dockerenv”是用于跨容器边界传输容器的环境变量-我也不建议依赖它的存在(IIRC,您链接到的代码是它仍然存在的唯一原因)。在/sys/fs/cgroup中可能有一些可疑的东西,但我最近没有检查过。
联系https://github.com/moby/moby/issues/18355#issuecomment-220484748
有没有比这更好的方法呢?来自Docker维护者的答案将非常受欢迎。谢谢!
1条答案
按热度按时间jaxagkaj1#
如果proc/1/cgroup是/,基本上可以保证您处于类似容器的系统中(但是请注意,如果cgroupns=host,则您将在容器中获得主机视图,因此请确保也检查这种情况)。在大多数Linux操作系统中,systemd是init系统,因此/proc/1/cgroup将是/init.scope,因此如果它不等于/init.scope,则您可能处于某种类型的容器中,并且我相信这应该适用于cgroupns=private以及cgroupns=host。Edit:在一个--priviliged容器中测试,systemd为init,cgroupns=private,不幸的是,它也会显示为/init.scope,所以只检查/proc/1/cgroup似乎只是一个最好的猜测。但是我相信只有主机级的/sys/fs/cgroup.procs才允许包含procs,任何其他容器在容器中时都应该有/sys/fs/cgroup.procs包含0项。所以看起来要检查/sys/fs/cgroup.procs是否为空-> container,如果它不为空,你仍然可以使用cgroupns=host,但是在这种情况下,你可以检查/proc/1/cgroup是否在containerpath中。Edit 2:根据https://systemd.io/CONTAINER_INTERFACE/:如果你编写的软件想要检测它是否在容器中运行,请检查/proc/1/environ并查找container=环境变量。这需要成为根。