使用不带凭据的Spring Boot插件发布Docker映像



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

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

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

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

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

这假设您已经以某种标准方式设置了AWS凭据,SDK中的默认凭据提供程序将找到这些凭据。

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]
}
}
}
}

Adrian的解决方案不再适用于较新的Gradle版本。我调整了他的解决方案:

import org.springframework.boot.gradle.tasks.bundling.BootBuildImage
import software.amazon.awssdk.services.ecr.EcrClient
import software.amazon.awssdk.services.ecr.model.AuthorizationData
import java.util.Base64
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath(platform("software.amazon.awssdk:bom:2.20.121"))
classpath("software.amazon.awssdk:ecr")
classpath("software.amazon.awssdk:sts") // sts is required to use roleArn in aws profiles
}
}
plugins {
id("org.springframework.boot")
kotlin("jvm")
kotlin("plugin.spring")
}
tasks.withType<BootBuildImage> {
val authData: Provider<AuthorizationData> = providers.provider {
val ecrClient = EcrClient.builder().build()
val authorizationData = ecrClient
.getAuthorizationToken()
.authorizationData()[0]
return@provider authorizationData
}
val decodedEcrToken: Provider<String> = authData.map { String(Base64.getDecoder().decode(it.authorizationToken())) }
val registryUsername: Provider<String> = decodedEcrToken.map { it.split(":")[0] }
val registryPassword: Provider<String> = decodedEcrToken.map { it.split(":")[1] }
docker {
publishRegistry {
username.set(registryUsername)
password.set(registryPassword)
}
}
}

最新更新