docker构建并发布插件使用情况

时间:2015-12-18 09:35:50

标签: jenkins docker jenkins-plugins

我有jenkins作为Docker容器运行,我试图在这里安装jenkins构建和发布插件并在jenkins工作区内复制Dockerfile,但每当我运行构建时,它都会给我:

Started by user Jenkins Admin
Building in workspace /var/lib/jenkins/jobs/workspace
[workspace] $ docker build -t index.docker.io/test/openshift:latest --pull=true /var/lib/jenkins/jobs/test/workspace
ERROR: Cannot run program "docker" (in directory "/var/lib/jenkins/jobs/workspace"): error=2, No such file or directory
java.io.IOException: Cannot run program "docker" (in directory "/var/lib/jenkins/jobs/workspace"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at hudson.Proc$LocalProc.<init>(Proc.java:244)
    at hudson.Proc$LocalProc.<init>(Proc.java:216)
    at hudson.Launcher$LocalLauncher.launch(Launcher.java:803)
    at hudson.Launcher$ProcStarter.start(Launcher.java:381)

Build step 'Docker Build and Publish' marked build as failure
Finished: FAILURE
你可以告诉我为什么会这样吗?

1 个答案:

答案 0 :(得分:6)

在Docker容器中,默认情况下您无权访问docker - 二进制文件(因此出现错误消息No such file or directory)。

如果你想在Docker容器中使用Docker,你需要使用 DinD (Docker-in-Docker)或 DooD (Docker-outside-of-泊坞窗)。 第一个是Jenkins容器中的单独Docker安装,第二个只通过卷安装主机Docker安装。

进一步阅读 DinD 一般和詹金斯:

进一步阅读 DooD 一般和Jenkins:

更新

以下有关使用Workflow插件的信息不再正确。 我已经编写了一个名为docker-swarm-slave的插件,它提供了一个构建包装器,你可以为一个工作配置它,如果你使用我的jenkins-dood-image或直接在裸机上运行,​​它会自动为构建提供一个Docker容器金属

遗憾的是,文档很稀疏,但也许对某人有用。

我有一个类似的用例:我希望能够自动启动一个Docker容器,其中运行Jenkins Swarm client的指定映像将接管构建。 我的jenkins-dood-image包含一个脚本docker-slave,它允许我自动配置Docker-Swarm-slave并使用Workflow-plugin执行我需要的操作,并使用如下脚本:

node('master') {
    stage 'Create docker-slave'
    withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'swarm-login', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
        sh 'docker-slave --job-name $JOB_NAME --build-number $BUILD_NUMBER -i pitkley/python-swarm:3.4 -u $USERNAME -p $PASSWORD -- -labels "${JOB_NAME}_${BUILD_NUMBER}"'
    }

    stage 'Execute on docker-slave'
    node("${env.JOB_NAME}_${env.BUILD_NUMBER}") {
        sh 'hostname'
    }

    stage 'Remove docker-slave'
    sh 'docker-slave --job-name $JOB_NAME --build-number $BUILD_NUMBER --rm'
}

(这假定您需要凭据来验证使用短ID swarm-credentials保存的凭据。)