【问题标题】:Mouting relative folders in docker-compose when using docker daemon via a container?通过容器使用 docker daemon 时在 docker-compose 中挂载相关文件夹?
【发布时间】:2018-05-31 22:29:18
【问题描述】:

我们之前一直在Docker in Docker (DIND) 模式下运行 Jenkins,即在 Jenkins docker 容器中运行一个 docker 守护进程。但是由于许多问题(其中一些在上面的链接中进行了描述),我们决定放弃这种方法,而是让容器使用主机守护进程,只需在启动容器时将其挂载为卷:

-v /var/run/docker.sock:/var/run/docker.sock

但是现在我们在使用Docker Compose 安装相对路径时遇到了问题,该路径是在 container 内启动的,在 DIND 模式下运行良好。考虑这个 docker-compose 文件:

myimage:
  build: .
  environment:
     LANG: C.UTF-8     
  working_dir: /code
  volumes:
    - ../../../:/code
    - ~/.m2/repository:/root/.m2/repository
    - ~/.gradle:/root/.gradle

以前这会从 container 装载所有文件夹,例如 ../../../ 文件夹,但现在它似乎尝试从 host 装载它们。当我检查主机上的目录结构时,似乎docker-compose 已经从容器中复制了目录结构,然后尝试挂载这个文件夹,使其为空。

所以我的问题是,当从主机使用 docker daemon 时,如何在 Docker Compose 中挂载相对路径?

【问题讨论】:

  • 不明白为什么这被否决了,我很想知道,以便将来改进我的问题。

标签: linux docker jenkins docker-compose docker-in-docker


【解决方案1】:

您需要确保主机上的相对路径与 Jenkins 容器内的相对路径相同。

这并不是真正的相对路径,docker-compose 正在尽最大努力将相对路径转换为 ​​docker 主机所需的绝对路径。所有路径都在 docker 主机上评估以创建一个新容器,它不知道您是在远程运行 docker 客户端还是在容器内运行,也不知道您当前在哪个目录。

作为另一种选择,您可能需要考虑切换到命名卷,并在您的 Jenkins 容器中映射与在其他容器中相同的命名卷。

【讨论】:

    【解决方案2】:

    Docker 有一个客户端服务器架构,当你挂载主机上的 docker 套接字时,你只是与主机 docker deamonm 通信。因此,所有主机卷路径都将被解释为主机上的路径。

    为了解决需要将 jenkins 容器目录绑定到主机上,然后使用主机文件夹作为挂载点的问题。因此只需使用

    启动 jenkins 容器
    -v ./code:<path-to-../../..> -v ./m2-repo:.../.m2/repository
    

    然后将撰写文件更改为使用主机文件夹:

    myimage:
      build: .
      environment:
         LANG: C.UTF-8     
      working_dir: /code
      volumes:
        - ./code:/code
        - ./m2-repo:/root/.m2/repository
        ...
    

    【讨论】:

    • 谢谢,但问题是每个 Jenkins 项目的 &lt;path-to-../../&gt; 都不同。我想避免每次添加新项目时都必须更改卷安装(请注意,我没有否决您的答案)。
    猜你喜欢
    • 2016-05-31
    • 2020-11-17
    • 2016-09-18
    • 2021-03-28
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多