

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 迁移到 Amazon ECR 存储库时自动识别重复的容器映像
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository"></a>

*Rishabh Yadav 和 Rishi Singla，Amazon Web Services*

## Summary
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-summary"></a>

此模式提供了一种自动解决方案，可识别存储在不同容器存储库中的映像是否重复。如果您计划将映像从其他容器存储库迁移到 Amazon Elastic Container Registry（Amazon ECR），此检查非常有用。

有关基础信息，此模式还描述了容器映像的组件，例如映像摘要、清单和标签。当您计划迁移到 Amazon ECR 时，您可能会决定通过比较映像摘要来跨容器注册表同步您的容器映像。迁移容器映像之前，您需要检查这些映像是否已存在于 Amazon ECR 存储库中，以防止重复。但是，可能很难通过比较映像摘要来检测重复，并且这可能会导致初始迁移阶段就出现问题。 此模式比较了存储在不同容器注册表中的两个相似映像的摘要，并解释了摘要不同的原因，以帮助您准确比较映像。

## 先决条件和限制
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-prereqs"></a>
+ 活跃的 AWS 账户
+ 访问 [Amazon ECR 公有注册表](https://gallery.ecr.aws/)
+ 熟悉以下内容： AWS 服务
  + [AWS CodeCommit](https://aws.amazon.com/codecommit/)
  + [AWS CodePipeline](https://aws.amazon.com/codepipeline/)
  + [AWS CodeBuild](https://aws.amazon.com/codebuild/)
  + [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/)
  + [Amazon Simple Storage Service（Amazon S3）](https://aws.amazon.com/s3/)
+ 已配置的 CodeCommit 凭证（参见[说明](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html)）

## 架构
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-architecture"></a>

**容器映像组件**

下图阐明了容器映像的其中一些组件。有关这些组件的描述，可参阅图表后面的内容。

![清单、配置、文件系统层和摘要。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7db5020c-6f5b-4e91-b91a-5b8ae844be1b/images/71b99c67-a934-4f94-8af8-2a8431fb91f5.png)


**术语和定义**

[开放容器倡议（OCI）映像规范](https://github.com/opencontainers/image-spec/blob/main/spec.md)中定义了以下术语。
+ **注册表：**用于映像存储和管理的服务。
+ **客户端：**与注册机构通信并处理本地映像的工具。
+ **推送：**将映像上传到注册表的过程。
+ **拉取：**从注册表下载映像的过程。
+ **Blob：**由注册表存储且可通过摘要进行寻址的二进制形式内容。
+ **索引：**用于识别不同计算机平台（例如 x86-64 或 ARM 64 位）或媒体类型的多个映像清单的构造。有关更多信息，请参阅 [OCI 映像索引规范](https://github.com/opencontainers/image-spec/blob/main/image-index.md)。
+ **清单：**用于定义通过清单端点上传的映像或构件的 JSON 文档。清单可以通过使用描述符来引用存储库中的其他 Blob。有关更多信息，请参阅 [OCI 映像清单规范](https://github.com/opencontainers/image-spec/blob/main/manifest.md)。
+ **文件系统层：**映像的系统库和其他依赖项。
+ **配置：**包含构件元数据且可在清单中引用的 blob。有关更多信息，请参阅 [OCI 映像设置规范](https://github.com/opencontainers/image-spec/blob/main/config.md)。
+ **对象或构件：**存储为 blob 并与具有配置的配套清单关联的概念性内容项。
+ **摘要：**根据清单内容的加密哈希值创建的唯一标识符。映像摘要有助于唯一标识不可变容器映像。使用其摘要拉取映像时，无论在何种操作系统或架构上，每次都会下载相同的映像。有关更多信息，请参阅 [OCI 映像规范](https://github.com/opencontainers/image-spec/blob/main/descriptor.md#digests)。
+ **标签：**人类可读的清单标识符。相较于不可变的映像摘要，标签是动态变化的。指向映像的标签可以更改并从一个映像移动到另一个映像，不过其底层映像摘会保持不变。

**目标架构**

下图显示了此模式提供的解决方案的高级架构，即通过比较存储在 Amazon ECR 和私有存储库中的映像来识别重复的容器映像。

![使用 CodePipeline 和 CodeBuild自动检测重复项。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7db5020c-6f5b-4e91-b91a-5b8ae844be1b/images/5ee62bc8-db8d-48a3-9e79-f3392b6e9bf7.png)


## 工具
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-tools"></a>

**AWS 服务**
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在资源的整个生命周期中跨地区对其 AWS 账户 进行管理。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管式构建服务，可编译源代码、运行单元测试和生成部署就绪的构件。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，可帮助您私下存储和管理 Git 存储库，而无需管理自己的源代码控制系统。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速对软件发布过程的不同阶段进行建模和配置，并自动执行持续发布软件变更所需步骤。
+ [Amazon Elastic Container Registry（Amazon ECR）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)是一项安全、可扩展且可靠的托管容器映像注册表服务。

**代码**

此模式的代码可在存储库中[找到，用于识别 GitHub 存储库之间重复的容器镜像的****自动解决方案](https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories/)。

## 最佳实践
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-best-practices"></a>
+ [CloudFormation  ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) 最佳实践
+ [AWS CodePipeline  ](https://docs.aws.amazon.com/codepipeline/latest/userguide/best-practices.html) 最佳实践

## 操作说明
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-epics"></a>

### 从 Amazon ECR 公有和私有存储库中拉取容器映像
<a name="pull-container-images-from-ecr-public-and-private-repositories"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 从 Amazon ECR 公有存储库中拉取映像。 | 从终端运行以下命令，以从 Amazon ECR 公有存储库中拉取映像 `amazonlinux`。<pre>$~ % docker pull public.ecr.aws/amazonlinux/amazonlinux:2018.03 </pre><br />将映像拉取到本地计算机后，您将看到以下拉取摘要，而该摘要可表示映像索引。<pre>2018.03: Pulling from amazonlinux/amazonlinux<br />4ddc0f8d367f: Pull complete <br /><br />Digest: sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5<br /><br />Status: Downloaded newer image for public.ecr.aws/amazonlinux/amazonlinux:2018.03<br />public.ecr.aws/amazonlinux/amazonlinux:2018.03</pre> | 应用程序开发人员、AWS DevOps、AWS 管理员 | 
| 将映像推送到 Amazon ECR 私有存储库。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理员、AWS DevOps、应用程序开发者 | 
| 从 Amazon ECR 私有存储库中拉取相同的映像。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | 应用程序开发人员、AWS DevOps、AWS 管理员 | 

### 比较映像清单
<a name="compare-the-image-manifests"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 查找存储在 Amazon ECR 公有存储库中的映像的清单。 | 从终端运行以下命令，以从 Amazon ECR 公有存储库中拉取映像 `public.ecr.aws/amazonlinux/amazonlinux:2018.03` 的清单。<pre>$~ % docker manifest inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03<br />{<br />   "schemaVersion": 2,<br />   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",<br />   "manifests": [<br />      {<br />         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",<br />         "size": 529,<br />         "digest": "sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02",<br />         "platform": {<br />            "architecture": "amd64",<br />            "os": "linux"<br />         }<br />      }<br />   ]<br />}</pre> | AWS 管理员、AWS DevOps、应用程序开发者 | 
| 查找存储在 Amazon ECR 私有存储库中的映像的清单。 | 从终端运行以下命令，以从 Amazon ECR 私有存储库中拉取映像 `<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest` 的清单。<pre>$~ % docker manifest inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest                                          <br />{<br />	"schemaVersion": 2,<br />	"mediaType": "application/vnd.docker.distribution.manifest.v2+json",<br />	"config": {<br />		"mediaType": "application/vnd.docker.container.image.v1+json",<br />		"size": 1477,<br />		"digest": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68"<br />	},<br />	"layers": [<br />		{<br />			"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",<br />			"size": 62267075,<br />			"digest": "sha256:4ddc0f8d367f424871a060e2067749f32bd36a91085e714dcb159952f2d71453"<br />		}<br />	]<br />}</pre> | AWS DevOps、AWS 系统管理员、应用程序开发者 | 
| 将 Docker 拉取的摘要与 Amazon ECR 私有存储库中映像的清单摘要进行比较。 | 另一个问题是，为什么 **docker pull** 命令提供的摘要与映像 `<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest` 的清单摘要不同。<br />用于 **docker pull** 的摘要表示存储在注册表中的映像清单的摘要。此摘要可视为哈希链的根，因为清单包含将下载并导入到 Docker 中的内容的哈希值。<br />Docker 中使用的映像 ID 可以在此清单 `config.digest` 中找到。这表示 Docker 使用的映像配置。因此，您可以这样说，清单就像是信封，而映像就是信封的内容。清单摘要始终与映像 ID 不同。但是，特定的清单应始终会创建相同的映像 ID。由于清单摘要是一个哈希链，因此我们不能保证指定映像 ID 的哈希链总是相同。在大多数情况下，它会创建相同的摘要，尽管 Docker 无法对此做出保证。清单摘要中可能存在的区别源于 Docker 没有在本地存储用 gzip 压缩的 blob。因此，尽管未压缩的内容保持不变，但导出层可能会创建不同的摘要。映像 ID 可确认未压缩的内容是否相同；也就是说，映像 ID 现在是内容可寻址标识符（`chainID`）。<br />要确认此信息，您可以比较 Amazon ECR 公有和私有存储库上的 **docker inspect** 命令的输出：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html)<br />结果验证了两个映像具有相同的映像 ID 摘要和层摘要。<br />身份证:`f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68`<br />层：`d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2`<br />此外，摘要的基础是本地管理的对象的字节（本地文件是容器映像层的 tar）或推送到注册表服务器的 blob。但是，当您将 blob 推送到注册表时，tar 会被压缩，并在压缩的 tar 文件中计算摘要。因此，**docker pull** 摘要值的差异源于在注册表（Amazon ECR 私有或公有）级别应用的压缩。此解释专门针对使用 Docker 客户端的情况。您不会在其他客户端（例如 **nerdctl** 或 **Finch**）上看到这种行为，因为在推拉操作期间，其不会自动压缩映像。 | AWS DevOps、AWS 系统管理员、应用程序开发者 | 

### 自动识别 Amazon ECR 公有和私有存储库之间的重复映像
<a name="automatically-identify-duplicate-images-between-ecr-public-and-private-repositories"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 将此模式的 GitHub 存储库克隆到本地文件夹：<pre>$git clone https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories</pre> | AWS 管理员，AWS DevOps | 
| 设置 CI/CD 管道。 |  GitHub 存储库中包含一个用于创建 CloudFormation 堆栈的`.yaml`文件，用于在其中设置管道 AWS CodePipeline。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html)<br />该管道将设置为两个阶段（CodeCommit 以及 CodeBuild，如架构图所示），以识别私有存储库中也存在于公共存储库中的图像。管道配置有以下资源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理员，AWS DevOps | 
| 填充 CodeCommit 存储库。 | 要填充 CodeCommit 存储库，请执行以下步骤：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理员，AWS DevOps | 
| 清理。 | 为避免将来产生费用，请按照以下步骤删除资源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理员 | 

## 问题排查
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 当您尝试从终端或命令行推送、拉取 CodeCommit 存储库或以其他方式与仓库交互时，系统会提示您提供用户名和密码，并且必须为您的 IAM 用户提供 Git 证书。 | 出现此错误的最常见原因如下：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html)<br />根据您的操作系统和本地环境，您可能需要安装凭证管理器、配置操作系统随附的凭证管理器或自定义您的本地环境以使用凭证存储。例如，如果您的计算机运行的是 macOS，您可以使用 Keychain Access 实用程序存储您的凭证。如果您的计算机运行的是 Windows，您可以使用随 Windows 版 Git 安装的 Git Credential Manager。有关更多信息，请参阅文档中的[使用 Git 凭据为 HTTPS 用户设置](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html)和 Git CodeCommit 文档中的[凭据存储](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage)。 | 
| 将映像推送到 Amazon ECR 存储库时，您会遇到 HTTP 403 或“没有基本的身份验证凭证”错误。 | **即使你已使用 aws ecr 命令成功向 **Docker 进行了身份验证，你也可能会在 docker push** **或 docker pull** 命令中遇到这些错误消息。 get-login-password**已知原因包括：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | 

## 相关资源
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-resources"></a>
+ 用于@@ [识别存储库（存储GitHub 库）之间重复的容器映像的自动化解决方案](https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories/)
+ [Amazon ECR 公开映像浏览馆](https://gallery.ecr.aws/)
+ [Amazon ECR 中的私有映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/images.html)（Amazon ECR 文档）
+ [AWS::CodePipeline::Pipeline 资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html)（CloudFormation 文档）
+ [OCI 映像格式规范](https://github.com/opencontainers/image-spec/blob/main/spec.md)

## 附加信息
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-additional"></a>

**Amazon ECR 公有存储库中映像的 Docker 检查输出**

```
[
    {
        "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68",
        "RepoTags": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest",
            "public.ecr.aws/amazonlinux/amazonlinux:2018.03"
        ],
        "RepoDigests": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02",
            "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-02-23T06:20:11.575053226Z",
        "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c",
        "ContainerConfig": {
            "Hostname": "ec7f2fc7d2b6",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.17",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 167436755,
        "VirtualSize": 167436755,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged",
                "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff",
                "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-03-02T10:28:47.142155987Z"
        }
    }
]
```

**Amazon ECR 私有存储库中映像的 Docker 检查输出**

```
[
    {
        "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68",
        "RepoTags": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest",
            "public.ecr.aws/amazonlinux/amazonlinux:2018.03"
        ],
        "RepoDigests": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02",
            "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-02-23T06:20:11.575053226Z",
        "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c",
        "ContainerConfig": {
            "Hostname": "ec7f2fc7d2b6",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.17",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 167436755,
        "VirtualSize": 167436755,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged",
                "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff",
                "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-03-02T10:28:47.142155987Z"
        }
    }
]
```