我有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
你可以告诉我为什么会这样吗?
答案 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
保存的凭据。)