Dockerpipe道的“内部”在Docker容器内运行的Jenkins从站中不起作用
我有问题得到一个jenkinspipe道脚本工作,使用Dockerpipe道插件来运行Docker容器内的部分构build。 Jenkins服务器和从服务器都在Docker容器中运行。
build立
- Jenkins服务器在Docker容器中运行
- jenkins奴隶基于自定义图像( https://github.com/simulogics/protokube-jenkins-slave )运行在一个docker集装箱
- 基于Docker的Docker守护进程容器
docker:1.12-dind
映像 - 奴隶开始像这样:
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操作(拉取,构build和推送图像)在这个设置下工作得很好。
(非)目标
- 我希望服务器根本不必了解Docker。 这应该是从机/节点的特征。
- 我不需要dynamic分配奴隶或短暂的奴隶。 手动启动的一个从设备对我来说已经足够了。
- 理想情况下,我想从我的自定义Docker镜像移走,而是使用Dockerpipe道插件提供的
inside
函数。
问题
这是导致问题的代表性构build步骤:
image.inside { stage ('Install Ruby Dependencies') { sh "bundle install" } }
这会在日志中导致这样的错误:
sh:1:无法创build/ 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 :
为了在里面工作,Docker服务器和Jenkins代理必须使用相同的文件系统,以便可以挂载工作空间。 确保这个最简单的方法是Docker服务器在本地主机(与代理程序相同的计算机)上运行。 目前,Jenkins插件和Docker CLI都不会自动检测服务器远程运行的情况; 一个典型的症状将是嵌套的sh命令,如
不能创build/ … @ tmp / durable- … / pid:目录不存在或负的退出代码。
当Jenkins可以检测到代理本身在Docker容器中运行时,它会自动将-volumes-fromparameter passing给内部容器,以确保它可以与代理共享工作区。
不幸的是,最后一段中描述的检测似乎不起作用。
题
由于我的服务器和从属服务器都在Docker容器中运行,我必须使用哪个小孩的卷映射才能使其工作?
我已经看到这个问题的变化,也与由kubernetes-plugin
供电的agents
。
我认为它的工作agent/jnlp
容器需要与生成容器共享工作区。
通过build
容器,我指的是将运行bundle install
命令。
这可能可以通过withArgs
工作
问题是你为什么要这样做? 大部分的pipe道步骤都在master上执行,实际的构build将在build
容器中运行。 还使用agent
的目的是什么?