【发布时间】:2017-09-14 12:13:54
【问题描述】:
我在让 Jenkins 流水线脚本工作时遇到问题,该脚本使用 Docker 流水线插件在 Docker 容器中运行部分构建。 Jenkins server 和 slave 都在 Docker 容器中运行。
设置
- 在 Docker 容器中运行的 Jenkins 服务器
- Jenkins slave 基于自定义镜像 (https://github.com/simulogics/protokube-jenkins-slave) 也在 Docker 容器中运行
- 基于
docker:1.12-dind镜像的Docker daemon容器 - Slave 是这样开始的:
docker run --link=docker-daemon:docker --link=jenkins:master -d --name protokube-jenkins-slave -e EXTRA_PARAMS="-username xxx -password xxx -labels docker" simulogics/protokube-jenkins-slave
基本 Docker 操作(拉取、构建和推送映像)在此设置下运行良好。
(非)目标
- 我希望服务器根本不必了解 Docker。这应该是从站/节点的特性。
- 我不需要动态分配从站或临时从站。一个手动启动的从站对我的目的来说已经足够了。
- 理想情况下,我想从我的从属的自定义 Docker 映像中移开,而是使用通用 Docker 从属中的 Docker 管道插件提供的
inside函数。
问题
这是导致问题的代表性构建步骤:
image.inside {
stage ('Install Ruby Dependencies') {
sh "bundle install"
}
}
这会导致日志中出现这样的错误:
sh: 1: 无法创建 /workspace/repo_branch-K5EM5XEVEIPSV2SZZUR337V7FG4BZXHD4VORYFYISRWIO3N6U67Q@tmp/durable-98bb4c3d/pid:目录不存在
以前,此警告会显示:
71f4de289962-5790bfcc 似乎在容器 71f4de28996233340c2aed4212248f1e73281f1cd7282a54a36ceeac8c65ec0a 内运行 但是在[]中找不到/workspace/repo_branch-K5EM5XEVEIPSV2SZZUR337V7FG4BZXHD4VORYFYISRWIO3N6U67Q
有趣的是,这个问题在 CloudBees 插件文档中描述了这里https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/index.html#docker-workflow-sect-inside:
要让 inside 工作,Docker 服务器和 Jenkins 代理必须使用相同的文件系统,以便可以挂载工作区。确保这一点的最简单方法是让 Docker 服务器在 localhost(与代理相同的计算机)上运行。目前Jenkins插件和Docker CLI都不会自动检测服务器远程运行的情况;一个典型的症状是来自嵌套 sh 命令的错误,例如
无法创建/…@tmp/durable-…/pid:目录不存在 或负退出代码。
当 Jenkins 可以检测到代理本身在 Docker 容器内运行时,它会自动将 --volumes-from 参数传递给内部容器,确保它可以与代理共享工作空间。
不幸的是,上一段中描述的检测似乎不起作用。
问题
由于我的服务器和从服务器都在 Docker 容器中运行,我必须使用哪个卷映射小子才能使其工作?
【问题讨论】:
-
可以运行 ps aux 并检查容器是否确实使用
--volumes-from启动?此外,此标志将在未来被弃用。至少来自compose -
Docker 管道插件记录发出给 Docker 的命令,但它不包含 --volumes-from 标志。
-
@Lunikon-欣赏这是一个老问题。你还记得曾经达成过决议吗?
-
相关 - stackoverflow.com/questions/60293353/… 提供赏金。
-
@arcseldon 我们已经切换到 GitLab 来满足我们所有的 CI/CD 需求,我不确定在这样做之前我们是否或如何解决这个 Docker 问题。对不起。
标签: docker jenkins jenkins-pipeline