更新:因为有人问过这个问题,所以发布了 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" }}'
这对于 OP 的请求并不完美,因为可能有多个 compose 文件,该文件可能位于运行 compose 的不同目录中,并且它不会捕获环境变量或配置文件等内容可以修改 compose 启动项目的方式。但是我怀疑它可以让大多数人足够接近以找到源头。
如果您使用的是旧版本的 compose,则可以使用以下原始答案中的选项之一:
据我所知, 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} 环境变量,你可以从 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}}'