确定进程是否在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=lxc
variables,你在一个容器内。
否则,如果你是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)