我试图找出我的脚本是在docker容器中运行还是在python脚本中运行。
类似于:
if inside_docker():
do_stuff()
else:
do_some_other_stuff()
要做到这一点,我发现唯一的方法是我可以检查主机名(使用platform.node()
),如果主机名与我的计算机不同,那么它就不在docker中(因为主机名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
。如果我在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
有什么办法解决这个问题吗?
作为一个辅助节点,我正在考虑使我的解决方案可移植,但docker应该已经是可移植的,所以如果我在docker中,这应该总是有效的……
发布于 2017-05-10 04:36:42
我认为最好的方法是通过环境变量。如果要从Dockerfile创建Python应用程序,可以指定'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')
发布于 2018-02-10 00:53:53
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))
)
发布于 2017-05-10 05:58:20
import os, re
path = "/proc/self/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())
https://stackoverflow.com/questions/43878953
复制相似问题