如何更新 Google Artifact Registry 中的图像?

How can I update an Image in Google Artifact Registry?

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

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

因此,问题可能出在 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 的部署时容器而不每次我们构建时都制作新图像?我假设这些图像正在占用 space 而我是 getting billed for it。我假设有一种方法可以“更新”Artifact Registry 中的现有图像,因为有一个“已更新”列。

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

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

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