从正在运行的容器获取 docker-compose.yml 文件位置?

问题描述 投票:0回答:7

我有一些通过执行

docker-compose up
创建的正在运行的 docker 容器。

有什么方法可以通过检查正在运行的容器来获取用于启动这些容器的相应 docker-compose.yml 文件的确切文件路径?

据我所知,

docker inspect CONTAINER_NAME
没有提供此信息,docker-compose也没有提供从正在运行的容器获取与compose相关的信息的方法。

我想在脚本中做什么:

  • 列出 docker 主机上某些正在运行的容器
  • 获取对应的docker-compose.yml文件位置
  • 使用 docker-compose 一次性重启对应 docker-compose 项目的所有容器
docker docker-compose
7个回答
81
投票

这个问题的答案似乎随着新版本的 docker-compose 而改变。 有一个标签

"com.docker.compose.project.working_dir": "/var/opt/docker",
指向我启动docker-compose的目录。我还没有检查这是
pwd
还是 docker-compose.yml 文件的实际位置。

这让我获得了有关 docker-compose 的有趣信息:

samuel@vmhost1:~$ docker 检查 fc440a1afbaa | grep com.docker.compose
                "com.docker.compose.config-hash": "89069285a4783b79b421ea84f2b652becbdee148fbad095a6d9d85aab67ececc",
                "com.docker.compose.container-number": "1",
                "com.docker.compose.oneoff": "假",
                "com.docker.compose.project": "docker",
                "com.docker.compose.project.config_files": "docker-compose.yml",
                "com.docker.compose.project.working_dir": "/var/opt/docker",
                "com.docker.compose.service": "詹金斯",
                “com.docker.compose.version”:“1.25.0”
塞缪尔@vmhost1:~$ 

我正在运行 docker-compose.yml 配置版本 3.6


28
投票

可以使用inspect命令来识别,如下:

docker inspect <container_id> | grep compose

18
投票

目前不可能

作为替代方案,以下内容可能会有所帮助:

  • 使用
    docker ps -a | grep <certain_container>
  • 使用
    locate docker-compose.yml
    找到您想要的
  • 使用
    docker-compose restart
    (执行
    docker-compose
    查看选项)

13
投票

更新:既然有人提出这个问题,docker compose v2 就被发布了,它是用 Go 编写的,可以从

docker compose
而不是
docker-compose
访问(也可能有一个垫片将
docker-compose
定向到这个新版本,具体取决于您的安装) 。此版本现在将目录嵌入到图像标签中,您可以使用以下方式检索:

docker container inspect ${container_name_or_id} \
  --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}'

这对于OP的请求来说并不完美,因为可能有多个撰写文件,该文件可能位于与运行撰写的目录不同的目录中,并且它不会捕获可能会修改的环境变量或配置文件等内容compose 如何启动项目。但我怀疑它能让大多数人足够接近找到来源。

如果您使用的是旧版本的 compose,您可以使用下面原始答案中的选项之一:


据我所知, docker inform CONTAINER_NAME 没有提供 这些信息,docker-compose也没有提供获取的方法 来自正在运行的容器的与撰写相关的信息。

对于您无法控制的已运行容器,信息不存在。如果容器创建任何主机挂载到相关目录,您可以使用绑定挂载目录推断位置。否则,可以在没有 compose 的情况下部署容器,并且可以在文件系统上没有 compose 文件的情况下使用 compose(通过 stdin 进行管道传输),并且 compose 不会为您存储有关正在运行的容器的这些详细信息。


我想在脚本中做什么:

  • 列出 docker 主机上某些正在运行的容器
  • 获取对应的docker-compose.yml文件位置
  • 使用docker-compose一次性重启对应docker-compose项目的所有容器

如果您只想在同一项目中的所有容器上运行重新启动,则不需要前两个步骤,甚至不需要

docker-compose
。相反,您可以运行:

docker ps --filter "label=com.docker.compose.project=${your_compose_project}" -q \
| xargs docker restart

它使用 docker-compose 标签添加到它部署的每个项目中。


如果您想主动存储撰写文件位置以供以后使用,您可以将其作为标签注入到您的撰写文件中:

version: '2'
services:
  test:
    image: busybox
    command: tail -f /dev/null
    labels:
      COMPOSE_PATH: ${PWD} # many Linux shells define the PWD variable

如果您的 shell 未设置

${PWD}
环境变量,您可以使用以下命令开始 compose:

PWD=$(pwd) docker-compose up -d

然后您可以稍后检查容器中该标签的值:

docker inspect --format '{{.Config.Labels.COMPOSE_PATH}}' ${your_container_id}

您可以将过滤器和检查命令链接在一起以查找特定项目的路径:

docker ps --filter "label=com.docker.compose.project=${your_compose_project}" -q \
| xargs docker inspect --format '{{.Config.Labels.COMPOSE_PATH}}'

6
投票

你知道,你的问题变成了对我同样问题的有用答案。 我使用了

docker inspect <containerID>
,然后它给了我应该查看的位置。特别是在这些方面:

HostConfig": {
            "Binds": [
....
...
],

2
投票

如果您安装了本地卷,例如

./data
,那么检查容器将为您提供路径,例如
docker inspect peertube_peertube_1 | jq .[0].HostConfig.Binds
。它不适用于没有卷的容器,但这种情况很罕见。


0
投票

docker compose ls
使用较新版本的 docker。例如,

$ sudo docker compose ls
NAME                STATUS              CONFIG FILES
mailu               running(11)         /mailu/docker-compose.yml
© www.soinside.com 2019 - 2024. All rights reserved.