首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测是否在Python的docker容器中运行?

如何检测是否在Python的docker容器中运行?
EN

Stack Overflow用户
提问于 2017-05-10 04:05:58
回答 4查看 11.7K关注 0票数 31

我试图找出我的脚本是在docker容器中运行还是在python脚本中运行。

类似于:

代码语言:javascript
复制
if inside_docker():
    do_stuff()
else:
    do_some_other_stuff()

要做到这一点,我发现唯一的方法是我可以检查主机名(使用platform.node()),如果主机名与我的计算机不同,那么它就不在docker中(因为主机名docker是一些奇怪的哈希或其他东西)。

相反,我想的是更具程序性的东西,如下所示:

使用cat /proc/1/cgroup

  • then首先检测docker,然后将这些层次结构的名称与docker id/
  1. 进行比较。

类似于:

代码语言:javascript
复制
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中,我会得到以下错误:

代码语言:javascript
复制
>>> 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中,这应该总是有效的……

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-10 04:36:42

我认为最好的方法是通过环境变量。如果要从Dockerfile创建Python应用程序,可以指定'ENV‘指令:

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

Dockerfile:

代码语言:javascript
复制
...
ENV AM_I_IN_A_DOCKER_CONTAINER Yes

然后可以从你的应用程序中读取,比如:

python_app.py:

代码语言:javascript
复制
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')
票数 40
EN

Stack Overflow用户

发布于 2018-02-10 00:53:53

is-docker package for npm建议了一种健壮的方法,移植到Python 2.6+:

代码语言:javascript
复制
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))
    )
票数 25
EN

Stack Overflow用户

发布于 2017-05-10 05:58:20

代码语言:javascript
复制
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())
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43878953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档