4

我正在开发一个利用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)过滤容器的函数,但现在我有一个硬编码的项目名称而不是容器名称。有没有办法获取当前项目名称,或者有没有其他方法可以获取同一个compose中的容器列表?

谢谢

4

2 回答 2

3

这只是我脑海中的一个快速想法。

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

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

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

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

$ docker ps -aq -f label=com.docker.compose.project=$COMPOSE_PROJECT
于 2017-01-30T18:44:13.357 回答
0

The new (June 2021) docker compose V2 could simplify this query with:
docker compose ls

List running compose projects

Since compose is part of Docker commands, you can call it from your python program.

于 2021-06-30T19:15:01.353 回答