docker - 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
?
解决方案
当 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
在主机系统上使用相同的路径,因此文件系统路径在每个上下文中都是相同的。
推荐阅读
- python - VSCode调试芹菜工人
- python - 基于字典分配的列中的无序值
- postgresql - 如何将 GeoJSON 地理数据转换为 PostGIS?
- c# - 使用帖子插入一些数据但实体模型对象带有空值?
- go - 不能使用 p[idx + 1:] (type []Person) 作为类型 Person in append
- javascript - 如何解决“我的第一个扫描值与我的第二个扫描值不同并且 HTML 中的值扫描与记事本中的值扫描不同?”
- vbscript - ForWriting 和 ForAppending VBS 的区别
- python-3.x - 使用 SQLAlchemy 向某些对象添加自定义删除行为
- c# - 如何在 C# 中使用 LINQ 以嵌套键:值格式转换 C# 对象列表?
- angular - Angular - 从子组件更改 Input() 不会通知父组件它已更新