如何更新 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 生成的容器。
在 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 生成的容器。