2

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

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

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

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

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

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

4

2 回答 2

0

您需要确保您的主机上的相对路径在您的 Jenkins 容器中是相同的,这样才能正常工作。

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

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

于 2017-12-18T15:03:31.253 回答
-1

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

为了解决这个问题,您需要将 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
    ...
于 2017-12-18T15:08:17.103 回答