确定进程是否在lxc / Docker中运行

有什么方法可以确定一个进程(脚本)是否在一个lxc容器(〜Docker运行时)中运行? 我知道一些程序能够检测到它们是否在虚拟机中运行,是否有类似lxc / docker的可用程序?

最可靠的方法是检查/proc/1/cgroup 。 它会告诉你init进程的控制组,当你不在一个容器中时,它将是/所有的层次结构。 当你一个容器中时,你会看到定位点的名字; 其中,与LXC / Docker容器,将分别像/lxc/<containerid>/docker/<containerid>

Docker在容器内的目录树的根目录下创build一个.dockerenv文件。 你可以运行这个脚本来validation

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

更多: Ubuntu实际上有一个bash脚本: /bin/running-in-container ,它实际上可以返回被调用的容器的types。可能会有帮助。 不过不知道其他主要的发行版。

最简单的方法是检查环境。 如果你有container=lxcvariables,你在一个容器内。

否则,如果你是root用户,你可以尝试执行mknod或者mount操作,如果失败的话,你最有可能在一个容器中掉线。

在新的Ubuntu 16.04系统上,新的systemd&lxc 2.0

 sudo grep -qa container=lxc /proc/1/environ 

在bash脚本中检查docker的简洁方法是:

 #!/bin/bash if grep docker /proc/1/cgroup -qa; then echo I'm running on docker. fi 

方便的python函数来检查docker(linux-only,obvs。)中是否运行:

 def in_docker(): """ Returns: True if running in a docker container, else False """ with open('/proc/1/cgroup', 'rt') as ifh: return 'docker' in ifh.read() 

我的答案只适用于Node.js进程,但可能会遇到一些谁绊倒这个问题寻找一个Node.js的具体答案。

我有同样的问题,并依靠/proc/self/cgroup我创build了一个npm包 ,仅用于此目的 – 检测是否在Docker容器中运行Node.js进程。

容器化的npm模块将帮助你在Node.js中输出。 目前它还没有在Io.js中testing过,但是也可以在那里工作。

我们使用proc的sched(/ proc / $ PID / sched)来提取进程的PID。 容器中的进程的PID将不同于主机(非容器系统)上的PID。

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

 root@33044d65037c:~# cat /proc/1/sched | head -n 1 bash (5276, #threads: 1) 

在非容器主机上:

 $ cat /proc/1/sched | head -n 1 init (1, #threads: 1) 

这有助于区分,如果你在一个容器或没有。

Docker正在日益发展,所以我们不能肯定他们将来是否会保留.dockerenv .dockerinit

在大多数Linux中, init是第一个启动的过程。 但在容器的情况下,这是不正确的。

 #!/bin/bash if ps -p1|grep -q init;then echo "non-docker" else echo "docker" fi 

这就是问题解答: “找出操作系统是否在虚拟环境中运行” ; 虽然与OP的问题不一样,但它确实回答了寻找你所在的容器(如果有的话)的常见情况。

特别是,安装和阅读这个bash脚本的代码似乎工作得很好:

virt-what

 sudo apt install virt-what 

在Python中检查上面的所有解决scheme:

 import os import subprocess def in_container(): # type: () -> bool """ Determines if we're running in an lxc/docker container. """ out = subprocess.check_output('cat /proc/1/sched', shell=True) out = out.decode('utf-8').lower() checks = [ 'docker' in out, '/lxc/' in out, out.split()[0] not in ('systemd', 'init',), os.path.exists('/.dockerenv'), os.path.exists('/.dockerinit'), os.getenv('container', None) is not None ] return any(checks)