0

在 Google Cloud Platform 的 Artifact Registry 中查看图像时,有一个“更新”时间列。但是,每当我构建相同的图像并再次推送它时,它都会创建一个新图像。
在此处输入图像描述

作为 Cloud Build 过程的一部分,我正在拉取这个基于 Ruby 的映像,更新 gem,然后将其推送回 Artifact Registry 以用于后续的构建步骤(数据库迁移、单元测试)。我希望在更新 Ruby gem 时,在大多数情况下不会发生任何事情,从而产生相同的 Docker 映像。在这种情况下,我预计不会推送新层。然而,每次我构建时,总会有一个新的层被推送,因此是一个新的 Artifact。

因此,问题可能在于 Cloud Build 的gcr.io/cloud-builders/gsutil工作方式,而不是 Artifact Registry 本身。这是我的相关构建步骤,以防万一:

  - id: update_gems
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/{my repo}/{my image}:deploy',
            '-f', 'docker/bundled.Dockerfile', '.' ]
  - id: update_image
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'push',  'us-central1-docker.pkg.dev/$PROJECT_ID/{my repo}/{my image}:deploy' ]

第一步是指“bundled.Dockerfile”,其中包含以下内容:

FROM us-central1-docker.pkg.dev/{same project as above}/{my repo}/{my image}:deploy
WORKDIR /workspace
RUN bundle update
RUN bundle install

有没有办法完成我目前正在做的事情(即更新一个用于运行rspec测试和运行的部署时容器,rake db:migrate而无需在每次构建时都制作新图像?我假设这些图像正在占用空间并且我正在为此付费它。我假设有一种方法可以“更新”工件注册表中的现有图像,因为有一个“更新”列。

4

1 回答 1

1

您不是在查看容器“图像”。您正在查看图像的“层”。层的组合产生容器图像。这些也可以是 Cloud Build 等的工件。

您不能直接修改 Artifact Registry 中的图层。您对图像创建所做的任何更改都将导致一个或多个图层发生更改,同时导致创建一个或多个新图层。创建图像通常不会导致所有图层都发生变化。您的新图像可能是新旧图层的结果。图层缓存在工件注册表中以供将来的图像/构建使用。

多个容器镜像可以使用相同的层。如果 Google 允许您修改单个层,您将破坏/损坏生成的容器。

于 2020-12-04T22:41:38.257 回答