You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:17:33