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

时间:2017-05-09 20:05:58

标签: python docker

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

类似的东西:

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

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

相反,我正在考虑更多程序化程序如下:

  1. 首先使用cat /proc/1/cgroup
  2. 检测泊坞窗
  3. 然后将这些层次结构的名称与docker id / hash进行比较。
  4. 类似的东西:

    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中这应该总是有效...

4 个答案:

答案 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")