【问题标题】:Jenkins: Push to ECR from slave詹金斯:从奴隶推送到 ECR
【发布时间】:2018-10-19 15:21:36
【问题描述】:

我正在使用 spotify 的 maven 插件构建一个 docker 容器,然后尝试推送到 ecr。

在使用 Amazon ECR 插件成功登录后,使用 cloudbees Build and Publish 插件会发生这种情况。

这对詹金斯大师来说就像一个魅力。 但是我得到的奴隶:

no basic auth credentials

Build step 'Docker Build and Publish' marked build as failure

从奴隶推送超出了 ECR 插件的范围还是我错过了什么?

【问题讨论】:

标签: docker jenkins jenkins-plugins cloudbees amazon-ecr


【解决方案1】:

这里的答案不适用于我的管道。我发现这个解决方案很有效,而且很干净:

withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'myCreds', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
    
    sh '''
    aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${REGISTRY}

    ..
    '''
}

此解决方案不需要 aws cli v2。

【讨论】:

    【解决方案2】:

    您可能会遇到 ECR 插件中报告的错误:https://issues.jenkins-ci.org/browse/JENKINS-44143

    该线程中的不同人描述的症状略有不同,但共同的主题是 docker 未能使用 ECR 插件正确生成的身份验证详细信息。

    我发现在我的案例中,这是因为 ECR 插件保存到一个 docker 配置中,而 docker-commons 插件(处理 docker API 的实际工作)正在从另一个中读取。 Docker 在早期版本中更改了导致冲突的配置格式和位置。

    插件作者提供了一种解决方法,基本上只是先核对两个配置文件:

    node {
            //cleanup current user docker credentials
            sh 'rm  ~/.dockercfg || true'
            sh 'rm ~/.docker/config.json || true'
    
            //configure registry
            docker.withRegistry('https://ID.ecr.eu-west-1.amazonaws.com', 'ecr:eu-west-1:86c8f5ec-1ce1-4e94-80c2-18e23bbd724a') {
    
                //build image
                def customImage = docker.build("my-image:${env.BUILD_ID}")
    
                //push image
                customImage.push()
    }
    

    您可能想尝试将其纯粹作为调试步骤和快速修复(如果它有效,您可以确信这个错误是您的问题)。

    我的永久修复是简单地使用合理的默认值手动创建新样式 dockercfg,然后将环境变量设置为指向它。

    我在我的 Dockerfile 中这样做了,它创建了我的 Jenkins 实例,如下所示:

    RUN mkdir -p $JENKINS_HOME/.docker/ && \
        echo '{"auths":{}}' > $JENKINS_HOME/.docker/config.json
    ENV DOCKER_CONFIG $JENKINS_HOME/.docker
    

    【讨论】:

      【解决方案3】:

      您在从站中没有凭据,这就是您遇到的问题。我解决了这个问题,在按需从属服务器中运行的每个管道中注入此凭据。

       withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'AWS_EC2_key', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
                          sh "aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID}"
                          sh "aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY}"
                          sh '$(aws ecr get-login --no-include-email --region eu-central-1)'
      
      
                      sh "docker push ${your_ec2_repo}/${di_name}:image_name${newVersion}"
      

      当然你需要在slave中安装aws-cli

      【讨论】:

      • 感谢您的回答,但我既不想操作管道,也不想自己安装awscli和管理登录。
      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2018-08-02
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多