如何检测是否在Python内的Docker容器内运行?

我试图找出我的脚本是否在Docker容器中运行,或不在python脚本中。

就像是:

if inside_docker(): do_stuff() else: do_some_other_stuff() 

做到这一点,我发现如何做到这一点是唯一的方法是,我可以检查主机名(与platform.node() ),如果主机名是不一样的我的电脑,那么它不在docker(因为主机名docker是一些奇怪的哈希或者什么的)。

相反,我正在想一些更多的程序如下:

  1. 首先用cat /proc/1/cgroup检测cat /proc/1/cgroup
  2. 然后比较这些层次结构与docker id / hash的名称。

就像是:

 from subprocess import call import platform hash = call('cat /proc/1/cgroup') hostname = hostname = platform.node() docker_boolean = does_hostname_contain_docker_hash(hash, hostname) # true or false 

我认为这样的事情会起作用,但我甚至不能没有错误地调用cat /proc/1/cgroup 。 如果我在docker,我得到的错误:

 >>> from subprocess import call >>> call('from subprocess import call') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 523, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory 

任何想法如何解决?


作为一个边节点,我正在考虑使我的解决scheme可移植,但docker设备已经是可移植的,所以如果我在docker工,这应该总是工作…

我认为这样做的首选方式是通过环境variables。 如果您是从Dockerfile创buildPython应用程序,则可以指定“ENV”指令:

https://docs.docker.com/engine/reference/builder/#env

Dockerfile:

 ... ENV AM_I_IN_A_DOCKER_CONTAINER Yes 

然后可以从您的应用程序读取类似于:

python_app.py:

 import os SECRET_KEY = os.environ.get('AM_I_IN_A_DOCKER_CONTAINER', False) if SECRET_KEY: print('I am running in a Docker container') 
 import os, re path = "/proc/" + str(os.getpid()) + "/cgroup" def is_docker(): if not os.path.isfile(path): return False with open(path) as f: for line in f: if re.match("\d+:\w+:/docker/\w+", line): return True return False print(is_docker())