Docker管道的“内部”无法在Docker容器

时间:2017-09-14 12:13:54

标签: docker jenkins jenkins-pipeline

我遇到问题让Jenkins管道脚本工作,使用Docker Pipeline插件在Docker容器中运行部分构建。 Jenkins服务器和从服务器都在Docker容器中运行。

设置

  • Jenkins服务器在Docker容器中运行
  • Jenkins奴隶基于在Docker容器中运行的自定义图像(https://github.com/simulogics/protokube-jenkins-slave
  • 基于docker:1.12-dind image
  • 的Docker守护程序容器
  • 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。这应该是slave / node的特征。
  • 我不需要动态分配奴隶或短暂的奴隶。手动启动的一个奴隶对我来说已足够了。
  • 理想情况下,我想从奴隶的自定义Docker镜像中移开,而是使用通用Docker slave中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

  

对于内部工作,Docker服务器和Jenkins代理必须使用相同的文件系统,以便可以安装工作区。确保这一点的最简单方法是让Docker服务器在localhost(与代理程序相同的计算机)上运行。目前,Jenkins插件和Docker CLI都不会自动检测服务器远程运行的情况;典型的症状是来自嵌套sh命令的错误,例如

     

无法创建/ ... @ tmp / durable- ... / pid:目录不存在   或否定退出代码。

     

当Jenkins可以检测到代理本身在Docker容器内运行时,它会自动将--volumes-from参数传递给内部容器,确保它可以与代理共享工作区。

不幸的是,最后一段中描述的检测似乎不起作用。

问题

由于我的服务器和从服务器都在Docker容器中运行,我必须使用什么样的卷映射来使其工作?

1 个答案:

答案 0 :(得分:1)

我已经看到了此问题的变体,agents也提供了kubernetes-plugin

我认为要使它工作,agent/jnlp容器需要与build容器共享工作区。

通过build容器,我指的是将运行bundle install命令的容器。

这可能通过withArgs

起作用

问题是你为什么要那样做?无论如何,大多数管道步骤都在master上执行,实际构建将在build容器中运行。使用agent

的目的是什么?