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

如何在Kubernetes上的Jenkins Pipeline中安全传递DockerHub密码

解决Jenkins Pipeline引用DockerHub凭证失败的问题

你的问题出在两个核心点:

  • withCredentials 的语法错误:它需要用闭包{}包裹所有需要使用该凭证的代码块,你没有正确闭合,导致变量无法在后续步骤中生效。
  • 凭证使用的阶段错误:Docker Hub的登录凭证应该在Login-Into-Docker阶段使用,而不是Push阶段——推送镜像的前提是已经完成登录,你之前把凭证加到了错误的阶段。

修正后的完整Jenkinsfile

pipeline {
  agent {
    kubernetes {
      yaml '''
        apiVersion: v1
        kind: Pod
        spec:
          containers:
          - name: docker
            image: docker:latest
            command:
            - cat
            tty: true
            volumeMounts:
             - mountPath: /var/run/docker.sock
               name: docker-sock
          volumes:
          - name: docker-sock
            hostPath:
              path: /var/run/docker.sock    
        '''
    }
  }
  stages {
    stage('Clone') {
      steps {
        container('docker') {
          git branch: 'main', changelog: false, poll: false, url: '<my github URL>'
        }
      }
    }
    stage('Build-Docker-Image') {
      steps {
        container('docker') {
          sh 'docker build -t <my-dockerhub-username>/testing-image:latest .'
        }
      }
    }
    stage('Login-Into-Docker') {
      steps {
        // 正确使用withCredentials闭包,包裹需要使用凭证的container和sh步骤
        withCredentials([string(credentialsId: 'Docker_PW', variable: 'DOCKER_HUB_PW')]) {
          container('docker') {
            // 用双引号让Groovy解析变量,避免硬编码密码
            sh "docker login -u <my-dockerhub-username> -p ${DOCKER_HUB_PW}"
          }
        }
      }
    }
    stage('Push-Images-Docker-to-DockerHub') {
      steps {
        container('docker') {
          sh 'docker push <my-dockerhub-username>/testing-image:latest'
        }
      }
    }
    stage('Remove docker Images') {
      steps {
        container('docker') {
          sh 'docker image prune -af'
        }
      }
    }
  }
  
  post {
    always {
      container('docker') {
        sh 'docker logout'
      }
    }
  }
}

关键修改说明

  1. 修正withCredentials语法:
    把container和sh步骤全部放在withCredentials的{}闭包内,这样凭证变量DOCKER_HUB_PW才能在该作用域内被正确引用。

  2. 移到正确的阶段:
    将凭证逻辑放在Login-Into-Docker阶段——这是使用凭证的正确时机,登录完成后再执行推送操作。

  3. 变量引用语法:
    使用双引号包裹sh命令,让Groovy自动解析${DOCKER_HUB_PW}变量;如果用单引号,变量不会被解析,会直接把字符串${DOCKER_HUB_PW}作为密码传入,导致登录失败。

  4. 额外优化建议:
    你也可以把Docker Hub用户名也存储为Jenkins凭证(比如Secret Text),进一步避免硬编码,修改方式和密码一致:

    withCredentials([
      string(credentialsId: 'Docker_USER', variable: 'DOCKER_HUB_USER'),
      string(credentialsId: 'Docker_PW', variable: 'DOCKER_HUB_PW')
    ]) {
      container('docker') {
        sh "docker login -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PW}"
      }
    }
    

内容的提问来源于stack exchange,提问作者Akhil K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:15:34