首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查进程是否在docker容器内运行?

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

Stack Overflow用户
提问于 2014-05-07 16:49:23
回答 5查看 85.1K关注 0票数 108

Updated1我有一个外壳,它会在一些函数中改变TCP内核的参数,但现在我需要让这个外壳在Docker容器中运行,也就是说,外壳需要知道它正在容器中运行,并停止配置内核。

现在我不确定如何实现这一点,下面是容器中/proc/self/cgroup的内容:

代码语言:javascript
复制
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 runs inside lxc/Docker,但它在这种情况下似乎不起作用,我的容器的/proc/1/cgroup中的内容是:

代码语言:javascript
复制
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/

否/lxc/containerid

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-09 15:29:38

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

在停靠容器外部,/proc/1/cgroup中的所有条目都在/上结束,如下所示:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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:/
票数 82
EN

Stack Overflow用户

发布于 2016-05-04 06:21:09

我们使用进程的sched (/proc/$ PID /sched)来提取进程的PID。容器内的进程PID与主机(非容器系统)上的进程PID会有所不同。

例如,容器上的/proc/1/sched的输出将返回:

代码语言:javascript
复制
root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)

在非容器主机上:

代码语言:javascript
复制
$ cat /proc/1/sched  | head -n 1
init (1, #threads: 1)

这有助于区分您是否在容器中。例如你可以这样做:

代码语言:javascript
复制
if [[ ! $(cat /proc/1/sched | head -n 1 | grep init) ]]; then {
    echo in docker
} else {
    echo not in docker
} fi
票数 29
EN

Stack Overflow用户

发布于 2018-08-05 01:28:55

对我有效的方法是检查“/”的inode编号。在码头内部,这是一个非常高的数字。在码头外,它是一个非常小的数字,比如'2‘。我认为这种方法还取决于所使用的FileSystem。

示例

在docker内部:

代码语言:javascript
复制
# ls -ali / | sed '2!d' |awk {'print $1'}
1565265

在码头外

代码语言:javascript
复制
$ ls -ali / | sed '2!d' |awk {'print $1'}
2

在脚本中:

代码语言:javascript
复制
#!/bin/bash
INODE_NUM=`ls -ali / | sed '2!d' |awk {'print $1'}`
if [ $INODE_NUM == '2' ];
then
        echo "Outside the docker"
else
        echo "Inside the docker"
fi
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23513045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档