首页 > 解决方案 > Docker 中的 Jenkins:关于管道中绑定挂载的说明

问题描述

我在 Docker 容器中运行 Jenkins。在本文之后,我将绑定安装 Docker 套接字,以便从 dockerized Jenkins 与其交互。我也绑定安装容器目录jenkins_home。这是我的卷的快速回顾:

# Jenkins
volumes:
  - /var/run/docker.sock:/var/run/docker.sock:ro
  - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
  - ./bar:/var/jenkins_home

我从主机目录运行它/home/foo/,因此在主机文件系统中创建以下目录(并安装):

/home/foo/bar

现在,我有一个 Jenkins 管道 ( mypipe),它运行一个 docker-compose 文件,启动一个具有以下卷的 MySQL 容器:

# MySQL created from Jenkins
volumes:
  - ./data:/var/lib/mysql

奇怪的是,它最终安装:

/var/jenkins_home/workspace/mypipe/data</var/lib/mysql

代替:

/home/foo/bar/workspace/mypipe/data</var/lib/mysql

这是一个图形回顾:

在此处输入图像描述

搜索stackoverflow,原来它发生的原因是:

卷源路径(: 左侧)不是指中间容器,而是指主机文件系统!

没关系,但我的问题是:

为什么在那儿?

我的意思是为什么 does.data被准确地翻译成 path: /var/jenkins_home/workspace/…/data,因为 MySQL 容器不知道 path /var/jenkins_home

标签: dockerjenkinsdocker-volumemounted-volumes

解决方案


当 Docker 创建绑定挂载时,总是从宿主文件系统中的绝对路径到容器文件系统中的绝对路径。

当您docker-compose.yml命名相对路径时,Compose 首先扩展该路径,然后将其交给 Docker 守护程序。在您的示例中,您尝试./bar从文件绑定挂载/var/jenkins_home/workspace/mypipe/docker-compose.yml,因此 Compose 填写您在调用 Docker API 时看到的绝对路径。Compose 不知道当前目录实际上是来自 Docker 守护进程上下文中不同路径的绑定挂载。

如果您在 Jenkins 日志中查看脚本化管道调用的docker.inside { ... }行为,请将工作区目录安装到它启动的容器内的相同路径。解决您遇到的映射问题的最简单方法可能是/var/jenkins_home在主机系统上使用相同的路径,因此文件系统路径在每个上下文中都是相同的。


推荐阅读