使用Gradle插件将docker镜像推送到ECR

时间:2017-12-07 10:54:46

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

我正在使用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属性。

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

1 个答案:

答案 0 :(得分:0)

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

  

所有Docker任务,例如DockerPullImage,DockerPushImage等   配置了ECR注册表URL的用户将获得一个临时ECR   令牌。无需其他配置。可以设定   各个任务的注册表URL。

这应该与gradle-docker-plugin或Netflix的nebula-docker-plugin配合使用,后者也基于并扩展了'bmuschko'泊坞窗插件。

gradle-aws-ecr-plugin” BitBucket主页简要说明了如何配置AWS和ECR [URL]凭据。