【问题标题】:Get docker-compose.yml file location from running container?从正在运行的容器中获取 docker-compose.yml 文件位置?
【发布时间】:2017-06-25 18:40:39
【问题描述】:

我有一些通过执行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


    【解决方案1】:

    这个问题的答案似乎随着 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”:“假”, “com.docker.compose.project”:“码头工人”, “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” samuel@vmhost1:~$

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

    【讨论】:

    • working_dir 是撰写文件中指定的上下文,它不指向撰写文件的位置
    • @Guerrilla:什么意思?
    • @at54321 上下文和撰写文件不是一回事。上下文可以位于与撰写文件不同的位置
    • 这应该是答案
    【解决方案2】:

    目前不可能

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

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

    【讨论】:

      【解决方案3】:

      更新:因为有人问过这个问题,所以发布了 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}}'
      

      【讨论】:

      • 坏主意。使用pwd,您永远无法使用docker-compose -f ...
      • @A.B. pwd 部分的要点是,您可以在容器中注入标签,其中包含您稍后想要的详细信息。如果您覆盖撰写文件,请将其作为您管理的标签注入。
      • 默认情况下你甚至可以在那里。我打算建议curl --unix-socket /var/run/docker.sock http://localhost/containers/json | jq .[].Labels | grep com.docker.compose.project.working_dir | uniq,但这与您的答案相同。
      • @Utopiah 那是 compose v2,当我第一次回答这个问题时它并不存在。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果您安装了本地卷,例如 ./data,那么检查容器将为您提供路径,例如 docker inspect peertube_peertube_1 | jq .[0].HostConfig.Binds。它不适用于没有卷的容器,但它很少见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-07
          • 1970-01-01
          相关资源
          最近更新 更多