如何检查一个进程是否在 docker 容器内运行?

新手上路,请多包涵

[Updated1] 我有一个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:/

我可以使用上面的任何标志来确定此进程是否在容器内运行?

[Updated2]:我还注意到 Determining if a process running inside 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

原文由 harryz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 900
2 个回答

要检查 Docker 容器内部是否在 Docker 容器中,可以通过 /proc/1/cgroup 完成。正如 这篇文章 所建议的那样,您可以执行以下操作:

在 docker 容器外,— 中的所有条目都在 / /proc/1/cgroup 结束,您可以在此处看到:

 vagrant@ubuntu-13:~$ cat /proc/1/cgroup
11:name=systemd:/
10:hugetlb:/
9:perf_event:/
8:blkio:/
7:freezer:/
6:devices:/
5:memory:/
4:cpuacct:/
3:cpu:/
2:cpuset:/

在 Docker 容器中,一些控制组将属于 Docker(或 LXC):

 vagrant@ubuntu-13:~$ docker run busybox cat /proc/1/cgroup
11:name=systemd:/
10:hugetlb:/
9:perf_event:/
8:blkio:/
7:freezer:/
6:devices:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c2
5:memory:/
4:cpuacct:/
3:cpu:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c2
2:cpuset:/

原文由 Thomas Uhrig 发布,翻译遵循 CC BY-SA 3.0 许可协议

Docker 在容器目录树的顶部创建 .dockerenv.dockerinit在 v1.11 中删除)文件,因此您可能需要检查它们是否存在。

像这样的东西应该工作。

 #!/bin/bash
if [ -f /.dockerenv ]; then
    echo "I'm inside matrix ;(";
else
    echo "I'm living in real world!";
fi

原文由 at0S 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题