在同一个docker-compose中列出容器

时间:2017-01-30 14:11:33

标签: python docker docker-compose dockerpy

我正在开发一个利用docker-compose的应用程序。其中一个容器是一个监视器组件,它定期运行一个小的python脚本来获取兄弟容器的状态,并在其中一个容器停止时采取行动。

到目前为止,我使用了应该观看的所有容器名称列表,但现在我想知道我可以只查看由同一docker-compose命令创建的所有容器。

以前,代码看起来像这样:

watched_containers = ["component-a", "component-b"]
def inspect_containers():
    containers = {
        (container["Names"][0].lstrip("/"), container)
        for container in docker.Client().containers(all=True)
    }

    for container_name in watched_containers:
        if containers.get(container_name, {}).get("State") != "running":
            alert_container_stopped(container_name)

我发现dockerpy不知道docker-compose,所以我创建了一个基于docker-compose项目名称标签(com.docker.compose.project)过滤容器的函数,但现在我有了硬编码的项目名称而不是容器名称。有没有办法获取当前项目名称,还是有其他方法可以获取同一组合中的容器列表?

由于

2 个答案:

答案 0 :(得分:1)

这只是一个很快的想法。

当您在监视程序容器中使用Docker客户端库时,我假设您可以从监视程序容器中访问主机的Docker API。由于默认情况下每个容器的主机名都是容器ID,因此您可以使用它来让监视程序容器从Docker API中查找自己的标签。

以下是使用Docker CLI的示例; Python SDK应该以完全相同的方式工作:

$('form').on("click", ".testbutton", function(){    // event will bubble up to form

然后使用项目名称获取剩余的容器:

$ COMPOSE_PROJECT=$(docker inspect -f '{{ (index .Config.Labels "com.docker.compose.project") }}' $HOSTNAME)

答案 1 :(得分:0)

新的(2021 年 6 月)docker compose V2 可以通过以下方式简化此查询:
docker compose ls

<块引用>

列出正在运行的 compose 项目

由于 compose 是 Docker 命令的一部分,您可以从您的 Python 程序中调用它。