如何检测是否在Python内的Docker容器内运行?
我试图找出我的脚本是否在Docker容器中运行,或不在python脚本中。
就像是:
if inside_docker(): do_stuff() else: do_some_other_stuff()
做到这一点,我发现如何做到这一点是唯一的方法是,我可以检查主机名(与platform.node()
),如果主机名是不一样的我的电脑,那么它不在docker(因为主机名docker是一些奇怪的哈希或者什么的)。
相反,我正在想一些更多的程序如下:
- 首先用
cat /proc/1/cgroup
检测cat /proc/1/cgroup
- 然后比较这些层次结构与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())
- 从rhel6.5镜像构builddocker镜像
- 如何使用docker将lib集成到python项目中?
- 与Iperf的haproxy udpstream量
- Python在docker集装箱
- 在运行-it / bin / bash之外的docker容器中运行python脚本
- 命令'/ bin / sh -c sudo pip3 install -r requirements.txt'返回一个非零的代码:1
- 在PyCharm 2016中configuration远程解释器Docker时,图像名称下拉列表为空
- Docker:通过共享PID命名空间从UID获取主机用户名
- docker集装箱networking/ DNS /防火墙问题