如何从 AWS ECR 中提取私有 docker 映像以与 Java/Kotlin 中的 Testcontainers 库一起使用?

Jef*_*mer 5 java kotlin docker amazon-ecr testcontainers

GenericContainer我正在尝试以编程方式从托管在私有 AWS ECR 存储库中的 docker 映像创建并启动 Testcontainers 。这将用于自动化集成测试,将在本地和 CICD 管道内运行。我知道我需要进行身份验证才能下载映像,但我不清楚如何最好地从 AWS 获取身份验证信息并将其传递到 Testcontainers 上下文。我已阅读 Testcontainers 文档,但尚未找到有关如何对私有 docker 容器存储库进行身份验证的详细信息。

到目前为止我的代码是:

import org.testcontainers.containers.GenericContainer
import org.testcontainers.utility.DockerImageName

const val imageName = "<account>.dkr.ecr.<region>.amazonaws.com/<imageName>:<version>"
val testContainer = GenericContainer(DockerImageName.parse(imageName))
testContainer.start()
Run Code Online (Sandbox Code Playgroud)

当然,这会产生错误:

at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:247)
    at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)
    at java.base/java.lang.Thread.run(Thread.java:833)
com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"Head \"https://<account>.dkr.ecr.<region>.amazonaws.com/v2/<imageName>/manifests/<version>\": no basic auth credentials"}

Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现 Testcontainers 对于所有事情来说都很直观,但这个问题让我难住了。如何将 Testcontainers 与私有 AWS ECR 存储库结合使用?

Zie*_*zyk 0

介绍

你好。

以下步骤至少适用于(Ubuntu + testcontainers:1.19.3)。
不知道这是否是最佳方法,但对我来说效果很好。

默认情况下,要拉取测试容器使用的图像DefaultPullPolicy

package org.testcontainers.images;

....

/**
 * The default imagePullPolicy, which pulls the image from a remote repository only if it does not exist locally
 */
@Slf4j
@ToString
class DefaultPullPolicy extends AbstractImagePullPolicy {

    @Override
    protected boolean shouldPullCached(DockerImageName imageName, ImageData localImageData) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

如上所述,仅当您本地没有图像时,它才会尝试获取图像。

本地运行

因此,要在本地运行通过testcontainers使用私有 AWS ECR 映像的测试,您可以执行以下两件事:

  1. 预先手动获取它们。
  2. 或者您可以使用计算机上安装的AWS CLI登录 AWS :
aws ecr get-login-password --region ${your_region} | \
docker login --username AWS --password-stdin ${your_ecr_registry}
Run Code Online (Sandbox Code Playgroud)

并以标准方式运行测试,例如./mvnw clean test。然后,如果图像无法在本地访问,那么testcontainers将为您拉取它。当然,您的用户必须在 ECR 中拥有适当的权限。

在 Github 上运行操作

然后要在GitHub Actions上运行它,您无需更改任何内容:

    steps:
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ECR_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_ECR_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Setup Maven Action
        uses: s4u/setup-maven-action@v1.7.0
        with:
          java-version: '21'
          java-distribution: 'temurin'

      - name: Test with Maven
        run: ./mvnw --batch-mode --no-transfer-progress clean test
Run Code Online (Sandbox Code Playgroud)