通过容器使用docker守护程序时,在docker-compose中挂载相关文件夹?

问题描述 投票:1回答:2

我们以前在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中挂载相对路径?

linux docker jenkins docker-compose docker-in-docker
2个回答
0
投票

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

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

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


-1
投票

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
    ...
© www.soinside.com 2019 - 2024. All rights reserved.