本地Jenkins Pipeline使用Docker代理时Build阶段启动失败求助
问题描述
本地部署Jenkins后,创建了Docker容器代理的Pipeline,在Build and Test阶段遇到错误:
process apparently never started in /var/lib/jenkins/workspace/ci-cd-ec2@2@tmp/durable-72cb4860
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
已确认Jenkins用户组信息:
uid=135(jenkins) gid=142(jenkins) groups=142(jenkins),998(docker)
Pipeline代码如下:
pipeline { agent { docker { // Use a Docker image that has Maven, Java 21, and (optionally) Docker CLI installed. image 'jelastic/maven:3.9.5-openjdk-21' // Mount the host Docker socket so the container can run docker commands. args '--user root -v /var/run/docker.sock:/var/run/docker.sock' } } environment { // Define your Docker image name (update with your Docker Hub username and image name) DOCKER_IMAGE = "rajputuser/docker-shivam-imz:latest" // Set the SonarQube URL. Update this IP if needed. SONAR_URL = "http://172.17.0.2:9000" } stages { stage('Build and Test') { steps { // List files (for debugging) and run Maven to clean, compile, test, and package your app. sh 'ls -ltr' sh 'mvn clean package' } } stage('SonarQube Analysis') { steps { // Run SonarQube analysis using Maven. // Credentials for SonarQube are injected via SONAR_TOKEN. withCredentials([string(credentialsId: 'sonarqube', variable: 'SONAR_TOKEN')]) { sh 'mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN -Dsonar.host.url=${SONAR_URL}' echo 'SonarQube analysis completed successfully!' } } } stage('Build Docker Image') { agent { docker { image 'abhishekf5/maven-abhishek-docker-agent:v1' args '--user root --privileged -v /var/run/docker.sock:/var/run/docker.sock' // mount Docker socket to access the host's Docker daemon } } steps { // Build the Docker image using the Dockerfile in the workspace. sh 'docker build -t $DOCKER_IMAGE .' } } stage('Push Docker Image') { agent { docker { image 'abhishekf5/maven-abhishek-docker-agent:v1' args '--user root --privileged -v /var/run/docker.sock:/var/run/docker.sock' // mount Docker socket to access the host's Docker daemon } } steps { // Log in to Docker Hub and push the built image. withCredentials([usernamePassword(credentialsId: 'dockerhub', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) { sh 'echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin' sh 'docker push $DOCKER_IMAGE' } } } stage('Deploy to EC2') { agent { docker { image 'abhishekf5/maven-abhishek-docker-agent:v1' args '--user root --privileged -v /var/run/docker.sock:/var/run/docker.sock' // mount Docker socket to access the host's Docker daemon } } steps { // Deploy to an EC2 instance via SSH. withCredentials([sshUserPrivateKey(credentialsId: '27727626-31a0-4d61-ab9d-18353c0d6b89', keyFileVariable: 'EC2_KEY', usernameVariable: 'EC2_USER')]) { sh ''' ssh -o StrictHostKeyChecking=no -i $EC2_KEY $EC2_USER@your.ec2.instance.ip <<EOF docker pull $DOCKER_IMAGE docker stop springboot-app || true docker rm springboot-app || true docker run -d --name springboot-app -p 8081:8081 $DOCKER_IMAGE EOF ''' } } } } post { always { cleanWs() // Clean the workspace after the pipeline completes. } } }
已完成的排查操作:
- 验证Jenkins有权限访问
/var/run/docker.sock - 确认
jelastic/maven:3.9.5-openjdk-21镜像已正确拉取 - 确保Jenkins具备充足的CPU、内存及磁盘资源
- 添加
-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true参数,未获取到额外日志 - 手动在同一容器内执行
mvn clean package命令可正常运行 - 重启Jenkins和Docker服务,问题仍未解决
排查与解决思路
针对这个process apparently never started错误,结合已做排查,从以下方向尝试解决:
1. 检查Jenkins工作目录权限
主机上的Jenkins工作目录可能存在权限冲突,导致容器无法读写:
- 执行命令检查目录权限:
ls -ld /var/lib/jenkins/workspace/ci-cd-ec2@2 - 若目录所属用户/组不是
jenkins:jenkins,执行修改权限:chown -R jenkins:jenkins /var/lib/jenkins/workspace/ci-cd-ec2@2
2. 显式指定工作目录挂载
Jenkins Docker插件默认挂载工作目录,但可能存在路径或权限问题,尝试显式配置挂载:
修改全局代理的args:
args '--user root -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/jenkins/workspace/ci-cd-ec2@2:/var/jenkins_workspace'
同时在Build and Test阶段添加目录初始化步骤:
steps { sh 'mkdir -p /var/jenkins_workspace && chmod 777 /var/jenkins_workspace' sh 'ls -ltr' sh 'mvn clean package' }
3. 禁用Durable Task隔离特性
该错误常与Durable Task插件的持久化逻辑有关,尝试在Pipeline环境变量中禁用隔离:
environment { // 原有环境变量保留 DOCKER_CONTAINER_DISABLE_CLEANUP = 'true' JENKINS_DURABLE_TASK_DISABLE = 'true' }
4. 更换基础镜像测试
虽然手动执行正常,但Jenkins插件的容器启动逻辑可能和手动操作有差异,更换官方Maven镜像测试:
将全局代理的image改为maven:3.9.5-openjdk-21,再运行Pipeline。
5. 检查插件版本兼容性
Durable Task和Docker Pipeline插件版本不兼容也可能引发问题:
- 进入Jenkins插件管理页面,检查
Durable Task、Docker Pipeline插件是否为最新版本 - 更新插件后重启Jenkins,重新测试Pipeline
内容的提问来源于stack exchange,提问作者Shivam Kumar

