在 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
而无需在每次构建时都制作新图像?我假设这些图像正在占用空间并且我正在为此付费它。我假设有一种方法可以“更新”工件注册表中的现有图像,因为有一个“更新”列。