我试图找出我的脚本是否在docker容器内运行,或者不在python脚本中运行。
类似的东西:
if inside_docker():
do_stuff()
else:
do_some_other_stuff()
要做到这一点,我发现如何做的唯一的hacky方式是我可以检查主机名(使用platform.node()
),如果主机名与我的计算机不同,那么它不在docker中(因为主机名码头是一些奇怪的哈希或其他东西)。
相反,我正在考虑更多程序化程序如下:
cat /proc/1/cgroup
类似的东西:
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
。如果我在码头工具中,我会收到错误:
>>> 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
任何想法如何解决?
作为一个侧面节点,我正在考虑让我的解决方案可移植,但是docker已经被认为是可移植的,所以如果我在docker中这应该总是有效...
答案 0 :(得分:11)
我认为这样做的首选方法是通过环境变量。如果您从Dockerfile创建Python应用程序,则可以指定&#39; ENV&#39;指令:
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')
答案 1 :(得分:5)
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(-[ce]e)?/\w+", line):
return True
return False
print(is_docker())
答案 2 :(得分:5)
is-docker package for npm建议采用一种强大的方法,将其移植到Python 2.6 +:
import os
def is_docker():
path = '/proc/self/cgroup'
return (
os.path.exists('/.dockerenv') or
os.path.isfile(path) and any('docker' in line for line in open(path))
)
答案 3 :(得分:1)
与npm的is-docker包类似,我使用is_docker
函数创建了jaraco.docker。对于安装了该软件包的Python 3.5+:
from jaraco.docker import is_docker
if is_docker():
print("In docker")