如何检查Docker实例是否正在运行?

7

我正在使用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容器的方法,因此似乎是正确的路径。

  • 如何确定Python脚本是否正在运行Docker实例?

你不需要 | grep 部分,可以在 python 中完成。否则,shell = True 参数对 Popen() 有帮助吗?请参阅此处 - salezica
@slezica 有点吧。我猜如果我在subprocess.check_output(cmd, shell=True)周围使用try/except块,我可以使用另一个示例来使其工作 - 这感觉...很不专业,所以我想认为有更好的方法(当没有找到匹配项时,显然会返回非0代码,因此check_output会抛出异常)。 - enderland
3个回答

10

您可以使用 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))

6

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

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

如果docker ps命令失败(例如您没有启动docker-machine),则check_output将抛出异常。 然后可以进行简单的查找,以验证容器是否被找到/未找到:
if s.find('containername') != -1:
    print 'found!'
else:
    print 'not found.'

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


执行时我遇到了以下错误: s = subprocess.check_output('docker ps', shell=True)subprocess.CalledProcessError: 命令 'docker ps' 返回非零退出状态 1 - Ashish Bainade

0

虽然看起来你已经在正确的方向上,但我建议你使用docker-py,因为它会访问Docker创建的套接字来发出API请求。我目前正在使用这个库,它真的节省了很多时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接