泊坞窗推在詹金斯 - 拒绝:请求访问资源被拒绝

时间:2019-01-30 17:13:21

标签: docker jenkins jenkins-pipeline

所以我试图建立在詹金斯生成图像的管道,他们推到泊坞枢纽。 我在管理'Jenkins的凭证被称为同为“搬运工 - 轮毂凭证”,而且似乎被使用。

它可以建立,但它只是不通过推...帮助得到什么?我已经花了几个小时了,我不确定自己缺少什么。

我已经使用泊坞窗登录尝试,但詹金斯不允许它。

stage('Build image') {
    /* This builds the actual image; synonymous to
     * docker build on the command line */

     bat 'docker build -t username/foldername:build . '    }


stage('Push image') {
    /* Finally, we'll push the image with two tags:
    docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
        bat 'docker push username/foldername:build'
    }
}

我希望图像被推送,但是我有这个:

The push refers to repository [docker.io/username/foldername]
a73d7d9f4346: Preparing
964bdfb24a54: Preparing
1af124d739c9: Preparing
6cffeea81e5d: Preparing
614a79865f6d: Preparing
612d27bb923f: Preparing
ef68f6734aa4: Preparing
612d27bb923f: Waiting
ef68f6734aa4: Waiting
denied: requested access to the resource is denied

7 个答案:

答案 0 :(得分:2)

Image push阶段,您可以先进行docker login,然后再推动图像。尝试以下操作进行docker登录:

stage('Push image') {
    withCredentials([usernamePassword( credentialsId: 'docker-hub-credentials', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
        def registry_url = "registry.hub.docker.com/"
        bat "docker login -u $USER -p $PASSWORD ${registry_url}"
        docker.withRegistry("http://${registry_url}", "docker-hub-credentials") {
            // Push your image now
            bat "docker push username/foldername:build"
        }
    }
}

确保注册表URL正确。 上面的withCredentials([usernamePassword(...)])方法将设置两个环境变量USERPASSWORD,它们是来自凭据ID docker-hub-credentials的Docker注册表凭据。

答案 1 :(得分:1)

我找到了答案!!!

 stage('Push image') {
        withDockerRegistry([ credentialsId: "docker-hub-credentials", url: "" ]) {
        bat "docker push devopsglobalmedia/teamcitydocker:build"
        }

答案 2 :(得分:0)

一个更好的选择是使用Docker pipeline plugin(推荐的插件中提供)。

node {

  checkout scm
  def dockerImage

  stage('Build image') {
    dockerImage = docker.build("username/repository:tag")
  }

  stage('Push image') {
    dockerImage.push()
  }   

}

以这种方式进行操作,您必须在管道模型定义中指定Docker注册表的凭据。

Docker管道插件在将“管道模型定义”中分配的凭据应用于具有多分支管道的项目时遇到问题。也就是说,如果使用上面的代码,您将继续收到错误:

  

拒绝:请求的对资源的访问被拒绝

然后,您必须在Jenkins文件中指定凭据,如下所示:

node {

  checkout scm
  def dockerImage

  stage('Build image') {
    dockerImage = docker.build("username/repository:tag")
  }

  stage('Push image') {
    docker.withRegistry('https://registry-1.docker.io/v2/', 'docker-hub-credentials') {
      dockerImage.push()
    }
  }

}

如果需要,可以修改自定义注册表的URL

答案 3 :(得分:0)

我最近也遇到了同样的问题,这是Docker注册表URL错误

问题-https://index.docker.io/v1

修复-https://index.docker.io/v1/

是的,这是一个问题。我无法将其推送到docker Registry。

答案 4 :(得分:0)

我花了大约半天时间来解决它。请确保安装了Docker Pipeline Plugin

script {
  withDockerRegistry([ credentialsId: "Docker-Hub-Cred", url: "https://index.docker.io/v1/" ]){            
                             
  }
}  

答案 5 :(得分:0)

如果要推送私有存储库,则必须遵循以下命令:

第一:您必须确保jenkins上的dockerhub凭证。 第二:您已经在管道项目中创建了工作 第三:然后您必须使用jenkinsfile推送项目。 第四:现在可以构建詹金斯了。

我正在提供完整的Jenkinsfile,它将有助于解决此权限拒绝问题,并且您可以成功创建docker映像并将其推送到dockerhub。

pipeline {
     agent any
     stages{
        stage('Maven Install'){
                      agent any
                      steps{
                          bat 'mvn -f pom.xml clean install'
                      }
                  }

        stage('Docker Build'){
                         agent any
                         steps{
                             bat 'docker build -t dockerhub_username/repository_name/docker-jenkins-integration .'
                         }
                     }

        stage('Push image'){
                    agent any
                    steps{
                      
                        
                                       withDockerRegistry([ credentialsId: "id", url: "" ]) {
                                       bat "docker tag dockerhub_username/repository_name/docker-jenkins-integration dockerhub_username/repository_name:docker-jenkins-integration"
                                       bat "docker push dockerhub_username/repository_name:docker-jenkins-integration"
                                     }

                }


                }
     }

}

答案 6 :(得分:0)

截至今天,Docker 管道插件提供了登录 docker hub、构建镜像并最终推送的 groovy 方法。 以下是声明式管道的示例代码

pipeline {
agent any
stages {
    stage('Push container') {
        steps {
            echo "Workspace is $WORKSPACE"
            dir("$WORKSPACE/dir-to-Dockerfile") {
                script {
                    def REGISTRY_URL = "https://index.docker.io/v1/"
                    def USER_NAME = "your-registry-username"
                    docker.withRegistry("$REGISTRY_URL", 'DockerHub-Cred-ID-Defined-In-Jenkins') {
                        def image = docker.build("$USER_NAME/some-image-name:${env.BUILD_ID}")
                        image.push()
                    }
                }
            }
        }
    }
}
}