【问题标题】:Using Gradle plugin to push docker images to ECR使用 Gradle 插件将 docker 镜像推送到 ECR
【发布时间】:2018-08-20 07:41:57
【问题描述】:

我正在使用 gradle-docker-plugin 构建 docker 映像并将其推送到 Amazon 的 ECR。为此,我还使用了在 EC2 实例上运行的远程 docker 守护程序。我已经配置了一个自定义任务 EcrLoginTask 以使用 aws-java-sdk-ecr 库获取 ECR 授权令牌。相关代码如下: -

class EcrLoginTask extends DefaultTask {
    String accessKey
    String secretCode
    String region
    String registryId

    @TaskAction
    String getPassword() {
        AmazonECR ecrClient = AmazonECRClient.builder()
                .withRegion(Regions.fromName(region))
                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretCode))).build()
        GetAuthorizationTokenResult authorizationToken = ecrClient.getAuthorizationToken(
                new GetAuthorizationTokenRequest().withRegistryIds(registryId))
        String token = authorizationToken.getAuthorizationData().get(0).getAuthorizationToken()
        System.setProperty("DOCKER_PASS", token) // Will this work ?
        return token
    }

}

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.amazonaws:aws-java-sdk-ecr:1.11.244'
        classpath 'com.bmuschko:gradle-docker-plugin:3.2.1'
    }
}



docker {
    url = "tcp://remote-docker-host:2375"
    registryCredentials {
        username = 'AWS'
        password = System.getProperty("DOCKER_PASS")    // Need to provide at runtime !!!
        url = 'https://123456789123.dkr.ecr.eu-west-1.amazonaws.com'
    }
}

task getECRPassword(type: EcrLoginTask) {
    accessKey AWS_KEY
    secretCode AWS_SECRET
    region AWS_REGION
    registryId '139539380579'
}

task dbuild(type: DockerBuildImage) {
    dependsOn build
    inputDir = file(".")
    tag "139539380579.dkr.ecr.eu-west-1.amazonaws.com/n6duplicator"
}

task dpush(type: DockerPushImage) {
    dependsOn dbuild, getECRPassword
    imageName "123456789123.dkr.ecr.eu-west-1.amazonaws.com/n6duplicator"
}

远程 docker 连接工作正常,ECR 令牌也成功获取,dbuild 任务也成功执行。

问题

dpush 任务失败 - “无法推送图像:没有基本身份验证凭据”

我认为这是因为使用 EcrLoginTask 接收的授权令牌未传递到 docker 配置闭包 password 属性中。

我该如何解决?每次执行构建时,我都需要即时提供凭据。

【问题讨论】:

    标签: amazon-web-services docker gradle gradle-plugin


    【解决方案1】:

    看看“gradle-aws-ecr-plugin”。它能够在每次 AWS/Docker 命令调用期间获得一个新的(最新的)Amazon ECR docker 注册表令牌:

    所有 Docker 任务,例如 DockerPullImage、DockerPushImage 等。 配置了 ECR 注册表 URL 将获得一个临时 ECR 令牌。无需进一步配置。可以设置 单个任务的注册表 URL。

    这应该与 gradle-docker-plugin 或 Netflix 的 nebula-docker-plugin 一起工作,后者也是基于并扩展了 'bmuschko' docker 插件。

    gradle-aws-ecr-plugin”BitBucket 主页简明扼要地解释了如何配置 AWS 和 ECR [URL] 凭证。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2020-02-13
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多