如何检查进程是否在Docker容器中运行?

151
[更新1] 我有一个shell,其中的某些函数将更改TCP内核参数,但现在我需要使这个shell在Docker容器中运行,也就是说,该shell需要知道它正在容器内运行并停止配置内核。
现在我不确定如何实现这一点,这里是容器内/proc/self/cgroup的内容:
9:hugetlb:/
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/

是否有任何标志可以用来确定此进程是否在容器内运行?

[更新2]:我也注意到了如何确定进程是否在lxc / Docker中运行,但是在这种情况下似乎不起作用,我的容器的/proc/1/cgroup中的内容为:

8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/

无 /lxc/containerid


1
这不是一个非常清晰的问题。你为什么需要这个? - Henk Langeveld
2
确定进程是否在 LXC/Docker 中运行 - Johannes 'fish' Ziemke
在我的情况下,@fish 没有 /lxc/<containerid>,请查看更新。 - harryz
1
@HenkLangeveld内核参数在Docker容器中是只读的,因此我需要知道我的shell是否在容器内运行,并在我的shell中禁用内核函数。请参见更新。 - harryz
脚本中的某些步骤尝试修改内核参数,在Docker中运行时需要跳过这些步骤。明白。 - Henk Langeveld
13个回答

0
在使用GitPod时,似乎不存在/.dockerenv文件,因此我使用了以下额外的检查方法来补充@at0S的答案:
if [ -f /.dockerenv ] | [ -n "$(env | grep "^GITPOD")" ]; then
  echo "In Docker"
else
  echo "Outside Docker"
fi

0

进程ID为1的处理方式在容器和主机之间会有所不同:

  • 在Linux主机系统上,它将是systemd或init
  • 在Docker容器中,它将是由容器运行的进程,而不是systemd或init

检查进程ID为1的进程名称

$ ps -p 1 -o comm=

-1

2022年在macOS上需要这种功能,但只有@at0S的答案仍然适用于所有其他选项。

  • /proc/1/cgroup 在容器中只有根目录,除非另有配置
  • /proc/1/sched 显示相同的容器内进程编号。名称不同(bash),但这不太可移植。
  • 环境变量只有在自己配置容器时才起作用,但默认环境变量都没有帮助

我发现了其他答案列表中未列出的选项:/proc/1/mounts 包括一个路径中带有"docker"的overlay 文件系统。


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