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

Ste*_*fan 16 docker docker-compose

我有几个正在运行的docker容器通过执行创建docker-compose up.

有没有办法获得用于启动这些容器的相应docker-compose.yml文件的确切文件路径,只需检查正在运行的容器?

据我所知,docker inspect CONTAINER_NAME不提供此信息,docker-compose也没有提供从正在运行的容器中获取与撰写相关的信息的方法.

我想在脚本中做什么:

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

Ser*_*sta 26

您可以使用检查命令来识别它,如下所示:

docker inspect <container_id> | grep compose
Run Code Online (Sandbox Code Playgroud)


Sam*_*und 21

这个问题的答案似乎随着 docker-compose 的新版本而改变。有一个标签"com.docker.compose.project.working_dir": "/var/opt/docker",指向我启动 docker-compose 的目录。我还没有检查这是否是pwddocker-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

  • 工作目录是在撰写文件中指定的上下文,它不指向撰写文件的位置 (2认同)
  • @at54321 上下文和撰写文件不是同一件事。上下文可以位于与撰写文件不同的位置 (2认同)

BMi*_*tch 13

更新:既然有人提出这个问题,docker compose v2 就被发布了,它是用 Go 编写的,可以从 访问docker compose(根据您的安装,docker-compose也可能有一个 shim 指向这个新版本)。docker-compose此版本现在将目录嵌入到图像标签中,您可以使用以下命令进行检索:

docker container inspect ${container_name_or_id} \
  --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}'
Run Code Online (Sandbox Code Playgroud)

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

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


据我所知, docker inform CONTAINER_NAME 没有提供此信息, docker-compose 也没有提供从正在运行的容器获取与 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
Run Code Online (Sandbox Code Playgroud)

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


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

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

如果您的 shell 没有设置${PWD}环境变量,您可以使用以下命令开始 compose:

PWD=$(pwd) docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

然后您可以稍后使用以下命令检查容器中该标签的值:

docker inspect --format '{{.Config.Labels.COMPOSE_PATH}}' ${your_container_id}
Run Code Online (Sandbox Code Playgroud)

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

docker ps --filter "label=com.docker.compose.project=${your_compose_project}" -q \
| xargs docker inspect --format '{{.Config.Labels.COMPOSE_PATH}}'
Run Code Online (Sandbox Code Playgroud)


Thi*_*son 9

这是不是目前可能的。

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

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


小智 6

你知道,你的问题对我所遇到的同一问题来说是一个有用的答案。我使用了它docker inspect <containerID>,然后它给了我应该查看的位置。特别是在这些方面:

HostConfig": {
            "Binds": [
....
...
],
Run Code Online (Sandbox Code Playgroud)