使用 Spring Boot 插件无需凭据即可发布 Docker 镜像

Rad*_*Rad 6 docker spring-boot-gradle-plugin amazon-ecr

我有一个带有 Spring Boot 插件的 Gradle 项目,并尝试发布由该插件构建的图像:gradle bootBuildImage --publishImage

问题是发布“必须提供令牌或用户名/密码”,但我们不能这样做,因为我们在不同的环境中有不同的身份验证机制。例如,在我们正在使用的本地计算机上ecr-credentials-helper,管道使用aws ecr get-login-token | docker login.

有没有办法强制插件让 docker 处理身份验证?(我假设该插件使用主机上的 docker 守护进程)。

目前,我编写了一个任务来使用任务生成令牌文件aws ecr get-login-token并读取任务中的令牌文件bootBuildImage。但出于安全原因,我不喜欢这个解决方案。

Adr*_*ker 1

aws ecr get-login-password以下是使用 AWS Java SDK 在 Gradle 中进行复制的解决方案。尽管您可以直接从 Gradle 调用 CLI,但这会使构建脚本更加脆弱,因为它依赖于安装的特定版本的 CLI。特别是因为 ecr 登录是一个重大变化CLI v1 和 v2 之间的

这假设您以某种标准方式设置了 AWS 凭证,开发工具包中的默认凭证提供程序将找到该凭证。

import software.amazon.awssdk.services.ecr.EcrClient

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath platform("software.amazon.awssdk:bom:2.17.19")
        classpath "software.amazon.awssdk:ecr"
        classpath "software.amazon.awssdk:sts" // sts is required to use roleArn in aws profiles
    }
}

plugins {
    id "java"
    id "org.springframework.boot"
}

dependencies {
    implementation platform("org.springframework.boot:spring-boot-dependencies:2.5.3")
    implementation "org.springframework.boot:spring-boot-starter"
    // Rest of app dependencies
}

bootBuildImage {
    doFirst {
        String base64Token = EcrClient.create().getAuthorizationToken().authorizationData()[0].authorizationToken()
        String[] auth = new String( base64Token.decodeBase64() ).split(":", 2)

        docker {
            publishRegistry {
                username = auth[0]
                password = auth[1]
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)