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

是否从正在运行的容器中获取docker-compose.yml文件位置?,docker,docker-compose,Docker,Docker Compose,我有一些正在运行的docker容器,它们是通过执行docker compose up创建的 是否有任何方法可以通过检查正在运行的容器来获取用于启动这些容器的相应docker-compose.yml文件的确切文件路径 据我所知,docker inspect CONTAINER\u NAME没有提供此信息,docker compose也没有提供从正在运行的容器中获取compose相关信息的方法 我想在脚本中做什么: 列出docker主机上某些正在运行的容器 获取相应的docker-compose.

我有一些正在运行的docker容器,它们是通过执行
docker compose up
创建的

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

据我所知,
docker inspect CONTAINER\u NAME
没有提供此信息,docker compose也没有提供从正在运行的容器中获取compose相关信息的方法

我想在脚本中做什么:

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

目前不可能

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

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

你知道,你的问题变成了我对同一问题的有用答案。 我使用了
docker inspect
,然后它给了我应该查看的位置。具体而言:

HostConfig": {
            "Binds": [
....
...
],
据我所知,docker inspect 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}
环境变量,则可以从以下内容开始编写:

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}}'

这个问题的答案似乎随着docker compose的新版本而改变。 有一个标签
“com.docker.compose.project.working_dir”:“/var/opt/docker”,
指向我启动docker compose的目录。我没有检查这是
pwd
还是docker-compose.yml文件的实际位置

这让我了解了有关docker compose的有趣信息:

samuel@vmhost1:~$ docker inspect fc440a1afbaa | grep com.docker.compose "com.docker.compose.config-hash": "89069285a4783b79b421ea84f2b652becbdee148fbad095a6d9d85aab67ececc", "com.docker.compose.container-number": "1", "com.docker.compose.oneoff": "False", "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": "jenkins", "com.docker.compose.version": "1.25.0" samuel@vmhost1:~$ samuel@vmhost1:~$docker inspect fc440a1afbaa | grep com.docker.compose “com.docker.compose.config散列”:“89069285A4783B79B421A84F2B652BECBDE148FBAD095A6D9D85AAB67ECECCC”, “com.docker.compose.container number”:“1”, “com.docker.compose.oneoff”:“False”, “com.docker.compose.project”:“docker”, “com.docker.compose.project.config_文件”:“docker compose.yml”, “com.docker.compose.project.working_dir”:“/var/opt/docker”, “com.docker.compose.service”:“jenkins”, com.docker.compose.version:“1.25.0” samuel@vmhost1:~$
我正在运行docker-compose.yml配置版本3.6

这是个坏主意。使用
pwd
您永远无法使用
docker compose-f…
@A.B.
pwd
部分的要点是,您可以在容器中插入一个标签,其中包含稍后需要的详细信息。如果您覆盖了撰写文件,请将其作为您管理的标签插入。工作目录是撰写文件中指定的上下文,它不指向撰写文件的位置。非常好,谢谢