【问题标题】:How to check if a docker instance is running?如何检查 docker 实例是否正在运行?
【发布时间】:2016-02-23 19:53:07
【问题描述】:

我正在使用 Python 启动 docker 实例。

如何确定它们是否正在运行?我可以很容易地从终端使用docker ps,例如:

docker ps | grep myimagename

如果返回任何内容,则图像正在运行。如果它返回一个空字符串,则图像没有运行。

但是,我无法理解如何让 subprocess.Popen 使用它 - 它需要一个 参数列表,例如:

    p = subprocess.Popen(['docker', 'ps', '|', 'grep', 'myimagename'], stdout=subprocess.PIPE)
    print p.stdout

不起作用,因为它尝试使用“docker ps”并将其设为“docker”和“ps”命令(docker 不支持)。

似乎我也不能给它完整的命令,因为Popen 试图将 整个 第一个参数作为可执行文件运行,所以失败了:

    p = subprocess.Popen('docker ps | grep myimagename', stdout=subprocess.PIPE)
    print p.stdout

有没有办法从 Python 中实际运行 docker ps?我不知道尝试使用subprocess 是否是最佳途径。然而,这是我用来运行 docker 容器的工具,所以它似乎是正确的路径。

  • 如何确定 docker 实例是否从 Python 脚本运行?

【问题讨论】:

  • 您不需要| grep 部分,您可以从python 执行此操作。否则,Popen()shell = True 参数是否有帮助? See here
  • @slezica 之类的。我想使用另一个例子,我可以在subprocess.check_output(cmd, shell=True) 周围使用 try/except 块并让它工作 - 感觉......太老套了,所以我想认为有更好的方法(当没有找到匹配项时显然返回一个非 0 的代码,所以 check_output 抛出一个异常)。

标签: python macos docker


【解决方案1】:

一种选择是使用subprocess.check_output 设置shell=True(感谢 slezica!):

s = subprocess.check_output('docker ps', shell=True)
print 'Results of docker ps' + s

如果docker ps 命令失败(例如你没有启动你的d​​ocker-machine)那么check_output 将抛出一个异常。

然后,一个简单的查找可以验证您的容器是否已找到/未找到:

if s.find('containername') != -1:
    print 'found!'
else:
    print 'not found.'

在这种情况下,我也建议使用容器哈希 id 而不是容器 name,因为该名称可能在图像名称或docker ps 的其他结果中重复。

【讨论】:

  • 执行 s = subprocess.check_output('docker ps', shell=True) subprocess.CalledProcessError: Command 'docker ps' 返回非零退出状态 1
【解决方案2】:

你可以使用python docker客户端:

import docker
DOCKER_CLIENT = docker.DockerClient(base_url='unix://var/run/docker.sock')
RUNNING = 'running'

def is_running(container_name):
    """
    verify the status of a sniffer container by it's name
    :param container_name: the name of the container
    :return: Boolean if the status is ok
    """
    container = DOCKER_CLIENT.containers.get(container_name)

    container_state = container.attrs['State']

    container_is_running = container_state['Status'] == RUNNING

    return container_is_running

my_container_name = "asdf"
print(is_running(my_container_name))

【讨论】:

    【解决方案3】:

    即使您似乎在路上,我还是建议您使用docker-py,因为它访问由 docker 创建的套接字来发出 API 请求。我使用这个库目前使用这个库,它是实时节省。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2019-11-03
      • 2021-08-15
      • 2019-11-28
      • 1970-01-01
      相关资源
      最近更新 更多