我们以前在Docker in Docker(DIND)模式下运行Jenkins,即在Jenkins docker容器内运行docker守护进程。但是由于许多问题(其中一些在上面的链接中描述),我们决定放弃这种方法,而是让容器使用主机守护程序,只需在启动容器时将其作为卷安装:
-v /var/run/docker.sock:/var/run/docker.sock
但是现在我们在使用Docker Compose安装相对路径时会遇到问题,这些路径在容器内启动,在DIND模式下运行良好。考虑这个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中挂载相对路径?
您需要确保主机上的相对路径在Jenkins容器中是相同的,才能使其正常工作。
它并不是一个真正的相对路径,docker-compose正在尽最大努力将相对路径转换为docker主机所需的绝对路径。在docker主机上评估所有路径以创建新容器,它不知道您正在远程或在容器内运行docker客户端,并且它不知道您当前所在的目录。
作为另一种选择,您可能需要考虑切换到命名卷并在Jenkins容器中映射与其他容器中相同的命名卷。
Docker具有客户端服务器体系结构,当您安装主机上的docker socket时,您只需与主机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
...