拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 AWS SDK for Java 2.x 操作 Amazon ECR:从镜像仓库管理到 Docker 镜像推送的完整实战指南

使用 AWS SDK for Java 2.x 操作 Amazon ECR:从镜像仓库管理到 Docker 镜像推送的完整实战指南 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本文以 javav2/example_code/ecr 目录下的官方示例为核心系统讲解如何使用 AWS SDK for Java 2.x 编程式地与 Amazon Elastic Container RegistryAmazon ECR交互——包括创建与删除镜像仓库、设置与读取仓库策略、获取授权令牌、配置生命周期策略、推送并校验 Docker 镜像等关键操作。读完本文你将掌握 Hello 级入门示例listImages分页列镜像与仓库管理全流程场景ECRScenario的完整实现并能基于仓库中的源码与测试用例自行扩展、运行与验证。1. 背景与概述1.1 Amazon ECR 是什么Amazon ECR 是一个全托管的 Docker 容器镜像仓库它让开发者可以方便地存储、管理并部署 Docker 容器镜像见 ecr/README.md 的概述部分。在实际应用中团队可以借助EcrAsyncClient编程式地完成镜像的存取与管理并将其自动化集成到应用部署流水线中无需自己搭建和运维容器仓库基础设施。1.2 示例代码组成本目录下的示例由三个核心 Java 文件和一个 JUnit 测试文件构成文件职责HelloECR.java入门示例演示使用分页器列出指定仓库的全部镜像 TaglistImagesECRActions.java封装 10 个单动作操作的异步调用实现ECRScenario.java场景主程序以交互式步骤串起整个仓库管理流程ECRTest.javaJUnit 5 集成测试按顺序验证各动作的正确性从源码结构可以看出场景类使用异步客户端EcrAsyncClientCompletableFuture的编程模型这与传统同步阻塞式调用有明显差异是 Java SDK 2.x 高并发场景的推荐用法。2. 运行前的重要提醒原文档在“Important”一节明确提示运行这些示例前必须注意以下四点可能产生 AWS 费用运行代码含测试都会对 AWS 账户计费请参阅 AWS Pricing 与 Free Tier 页面了解预期费用。遵循最低权限原则建议只授予完成任务所需的最小权限Grant least privilege不要使用管理员级权限运行示例。区域兼容性本示例代码并未在每一个 AWS 区域测试过运行前请确认目标区域支持 Amazon ECR。破坏性操作风险场景中包含DeleteRepository可强制删除仓库及其全部镜像务必在测试专用资源上操作。3. 环境准备与工程结构3.1 前置条件完整的前置条件见 javav2/README.md要点如下本地可访问本仓库clone、fork 或下载 zip安装 Apache Maven版本 3.0Java 示例统一假定 SDK 能通过默认凭证链default credentials provider chain获取 AWS 凭证可配置~/.aws/configIAM Identity Center SSO或~/.aws/credentials临时凭证默认区域为us-east-1未显式配置区域时。对应到 pom.xml本项目锁定Java 21maven.compiler.source/target21通过 BOM 管理 AWS SDK 版本software.amazon.awssdk:bom:2.35.10并额外引入docker-java3.3.6用于在 Java 进程内直接调用本地 Docker 守护进程完成镜像推送。3.2 构建与运行方式在 javav2/example_code/ecr 目录下执行mvn package # 编译并打包生成 target 下的可执行 JAR mvn test # 运行 JUnit 测试需要补充一点由于场景中的pushDockerImage依赖本地 Docker 环境运行前必须保证 Docker 守护进程可用并提前在本地准备好名为echo-text的 Docker 镜像场景程序启动时会先检查该镜像是否存在不存在则直接退出。4. Hello Amazon ECR入门示例HelloECR.java 演示了 Java SDK 2.x 中最有代表性的分页器Paginator用法。4.1 运行方式java -cp target/ecr-1.0-SNAPSHOT.jar com.example.ecr.HelloECR repositoryName其中repositoryName为要列取镜像的 ECR 仓库名称。4.2 核心实现EcrClient ecrClient EcrClient.builder() .region(Region.US_EAST_1) .build(); ListImagesRequest listImagesPaginator ListImagesRequest.builder() .repositoryName(repoName) .build(); ListImagesIterable imagesIterable ecrClient.listImagesPaginator(listImagesPaginator); imagesIterable.stream() .flatMap(r - r.imageIds().stream()) .forEach(image - System.out.println(The docker image tag is: image.imageTag()));实现要点客户端构建时显式指定Region.US_EAST_1关键在listImagesPaginator它返回ListImagesIterableSDK 会自动处理分页每次请求默认返回最多 100 条镜像 ID代码只需对imageIds()流式展开即可拿到每个镜像的imageTag无需手动翻页。5. 场景Learn the basics仓库管理全流程ECRScenario.java 是本文档的核心场景示例它演示了以下 10 个步骤对应原文档 “Learn the basics” 的完整清单创建一个 Amazon ECR 仓库设置仓库策略Repository Policy读取并展示仓库策略获取 ECR 授权令牌Authorization Token获取仓库 URI为仓库设置生命周期策略Lifecycle Policy将本地 Docker 镜像推送到 ECR 仓库校验镜像是否已存在于仓库可选通过 AWS CLI 与 ECR 中的镜像交互删除 ECR 仓库。5.1 运行方式与参数java -cp target/ecr-1.0-SNAPSHOT.jar com.example.ecr.scenario.ECRScenario iamRoleARN accountId两个参数含义iamRoleARN拥有访问与管理 ECR 仓库权限的 IAM 角色 ARN用于写入仓库策略的 PrincipalaccountId你的 AWS 账户 ID用于拼接第 9 步的 CLI 指令中的 registry 地址。程序启动后是交互式的输入1运行完整流程输入2可直接清理上一次未跑完留下的echo-text仓库流程中每一步都需要输入c回车继续。5.2 场景前置条件根据 ECRScenario.java 的注释需按 AWS SDK for Java 开发者指南完成开发环境与凭证配置需要预先创建一个具有 Amazon ECR 操作权限的IAM 角色必须在本地 Docker 中存在名为echo-text的镜像否则程序会直接退出。6. 核心单动作 API 深度解析所有单动作实现集中在 ECRActions.java采用EcrAsyncClientCompletableFuture的异步模型。下面按原文档列出的动作逐一展开。6.1 CreateRepository创建仓库对应 ECRActions.java 中的createECRRepository对仓库名做空值校验抛出IllegalArgumentException通过getAsyncClient().createRepository(request)发起异步调用join()等待结果返回值是仓库 ARNresult.repository().repositoryArn()异常容错若捕获到EcrException且错误码为RepositoryAlreadyExistsException程序不报错而是转为describeRepositories查询已有仓库并返回其 ARN幂等处理。6.2 DeleteRepository删除仓库对应 ECRActions.java 中的deleteECRRepository请求中设置force(true)当仓库非空时强制删除并让 ECR 代为清理其中全部镜像场景第 10 步明确提示了这一点使用whenComplete回调 join()等待失败时区分EcrException与未知运行时异常。6.3 DescribeImages校验镜像存在对应 ECRActions.java 中的verifyImage请求通过imageIds(ImageIdentifier.builder().imageTag(imageTag).build())指定待查 Tag响应中imageDetails()非空即表示镜像存在输出Image is present in the repository.否则输出不存在提示该动作同时用于场景第 8 步与GetAuthorizationToken前的依赖校验。6.4 DescribeRepositories获取仓库 URI 与详情对应 ECRActions.java 中的getRepositoryURI通过describeRepositories获取仓库列表取第一个仓库的repositoryUri()输出仓库 URI 是部署到 EKS/ECS 时必须使用的镜像完整地址前缀这也是场景第 5 步专门讲解它的原因异常处理中特别处理了InterruptedException恢复线程中断标志后抛出。6.5 GetAuthorizationToken获取授权令牌对应 ECRActions.java 中的getAuthToken无参调用getAuthorizationToken()从响应authorizationData().get(0)中取出authorizationToken该令牌是后续docker login/ Docker 客户端 push 镜像的认证基础——没有它就无法对 ECR 仓库执行推拉与管理镜像操作。6.6 GetRepositoryPolicy读取仓库策略对应 ECRActions.java 中的getRepoPolicy按仓库名调用getRepositoryPolicy成功时返回policyText()JSON 字符串场景第 3 步将其打印出来用于确认策略已生效。6.7 SetRepositoryPolicy设置仓库策略对应 ECRActions.java 中的setRepoPolicy接收repoName与iamRole两个参数使用文本块模板生成策略 JSON通过String.format将 IAM 角色 ARN 填入Principal.AWS{ Version : 2012-10-17, Statement : [ { Sid : new statement, Effect : Allow, Principal : { AWS : iamRole }, Action : ecr:BatchGetImage } ] }该策略向指定主体授予ecr:BatchGetImage权限使其能从该仓库拉取 Docker 镜像异常分支中单独处理了RepositoryPolicyNotFoundException。6.8 SetLifeCyclePolicy设置生命周期策略对应 ECRActions.java 中的setLifeCyclePolicy通过StartLifecyclePolicyPreviewRequest提交策略文本触发生命周期策略预览注意原文档将该动作链接标记为StartLifecyclePolicyPreview示例策略自动清理 14 天以上、任何 Tag 状态的旧镜像{ rules: [ { rulePriority: 1, description: Expire images older than 14 days, selection: { tagStatus: any, countType: sinceImagePushed, countUnit: days, countNumber: 14 }, action: { type: expire } } ] }策略含义按“距推入时间超过 14 天”为条件对any任意 tag 状态的镜像执行expire动作从而控制仓库体积与成本。6.9 PushImageCmd推送本地 Docker 镜像对应 ECRActions.java 中的pushDockerImage是整个场景中技术最综合的一步先调用getAuthorizationToken()拿到令牌对令牌做Base64 解码取decodedToken.substring(4)跳过AWS:前缀作为 Docker 登录密码通过describeRepositories获取仓库repositoryUri()并截取/之前的部分作为 registry 地址构造docker-java的AuthConfig用户名AWS、上一步的密码、registry 地址使用getDockerClient().tagImageCmd(...)将本地镜像echo-text:latest打上仓库 URI 的 Tag调用pushImageCmd(registryUrl).withTag(...).withAuthConfig(authConfig).start().awaitCompletion()完成推送。Docker 客户端的构建逻辑ECRActions.java也做了平台适配Windows 下通过tcp://localhost:2375连接 Docker Desktop配 20 秒读写/连接超时其他平台使用默认本地 socket。6.10 异步客户端的底层配置场景中所有操作共用一个 getAsyncClient()值得单独说明HTTP 客户端选用NettyNioAsyncHttpClient基于 Netty Java NIO 的非阻塞事件驱动实现maxConcurrency(50)控制并发连接数连接/读/写超时均设 60 秒通过ClientOverrideConfiguration设置整体 API 调用超时 2 分钟、单次尝试超时 90 秒客户端以单例形式惰性初始化复用连接池避免重复建连开销。7. 集成测试验证动作正确性测试文件 ECRTest.java 使用 JUnit 5Order控制执行顺序Tag(IntegrationTest)标注集成测试testScenarioOrder 1按顺序依次执行创建仓库 → 设置策略 → 读取策略 → 获取令牌 → 获取 URI → 设置生命周期策略 → 推送镜像 → 校验镜像全部通过assertDoesNotThrow断言任一环节失败时会在 catch 中先删除仓库进行清理再抛出失败testHelloOrder 2复用HelloECR.listImageTags对已有仓库执行列镜像操作敏感参数来源仓库名、IAM 角色 ARN 等运行期参数通过 AWS Secrets Manager依赖中引入secretsmanager与gson从名为test/ecr的密钥中读取避免硬编码。运行测试的命令与 Java 示例一致mvn test需要特别强调运行这些集成测试会操作真实 AWS 资源可能产生费用且要求本机 Docker 可用、AWS 凭证有效。8. 附加资源与延伸学习场景第 9 步演示的 CLI 等价操作来自 ECRScenario.java# 1. 认证 aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin accountId.dkr.ecr.us-east-1.amazonaws.com # 2. 查看镜像详情 aws ecr describe-images --repository-name echo-text --image-ids imageTagecho-text # 3. 运行容器 docker run --rm accountId.dkr.ecr.us-east-1.amazonaws.com/echo-text:echo-text服务级文档Amazon ECR User Guidewhat-is-ecr、Amazon ECR API ReferenceSDK 参考SDK for Java 2.x 的software.amazon.awssdk.services.ecr包摘要与本示例配套的完整前置条件与测试说明见 javav2/README.md。9. 小结通过本仓库的 ecr/README.md 及其配套源码你可以获得一条完整的 ECR 编程实践路径从HelloECR的分页列镜像入门到ECRScenario的“建仓 → 授权 → 设策略 → 取令牌 → 推镜像 → 校验 → 清理”全流程闭环再到ECRTest的可复用集成测试骨架。所有动作均基于EcrAsyncClient异步客户端实现配合 docker-java 打通了“本地 Docker → ECR 云端仓库”的完整链路可直接作为 Java 服务端容器化发布流水线的参考实现。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐4 步在服务器上跑通 Claude Code 最佳实践从安装到第一条编排工作流4 步在服务器上跑通 Claude Code 最佳实践从安装到第一条编排工作流 你在服务器上新装了一个 AI 编程终端却不知道该怎么配。 claude co示例工程教程后端AWS SDK for Java 2.x 操作 Amazon S3 完全指南AWS SDK for Java 2.x 操作 Amazon S3 完全指南 概述 Amazon Simple Storage Service Amazon S示例工程教程后端AWS SDK for Java 2.x 操作 Amazon S3 实战指南基于 aws-doc-sdk-examples 官方示例仓库AWS SDK for Java 2.x 操作 Amazon S3 实战指南基于 aws doc sdk examples 官方示例仓库 本篇以 aws do示例工程教程后端上一篇node-fs-extra与GraphQL Code Generator自动化类型文件生成下一篇Finagle 负载均衡器Load Balancer指标完全解读通用指标、Aperture 专属指标与 Panic Mode 底层原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表