Как я могу обновить изображение в реестре артефактов Google?

#ruby #google-cloud-platform #dockerfile #google-cloud-build #google-artifact-registry

# #ruby #google-облачная платформа #dockerfile #google-cloud-build #google-artifact-registry

Вопрос:

При просмотре изображений в реестре артефактов Google Cloud Platform отображается столбец времени «Обновлено». Однако всякий раз, когда я создаю одно и то же изображение и нажимаю его снова, создается новое изображение.
введите описание изображения здесь

В рамках процесса облачной сборки я извлекаю это изображение на основе Ruby, обновляю gems, а затем возвращаю его обратно в реестр артефактов для использования на последующих этапах сборки (миграция БД, модульные тесты). Я надеюсь, что после обновления Ruby gems в большинстве случаев ничего не произойдет, что приведет к идентичному изображению Docker. В таком случае я бы не ожидал, что новые слои будут загружены. Однако при каждой сборке всегда появляется новый слой и, следовательно, новый артефакт.

Таким образом, проблема может заключаться в том, как gcr.io/cloud-builders/gsutil работает Cloud Build, а не в самом реестре артефактов. Вот мои соответствующие шаги сборки на случай, если это имеет значение:

   - 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' ]
 

Первый шаг относится к «связанному.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 , без создания новых образов при каждой сборке? Я предполагаю, что эти изображения занимают место, и мне за это выставляют счет. Я предполагаю, что есть способ «Обновить» существующее изображение в реестре артефактов, поскольку в нем есть столбец «Обновлено».

Ответ №1:

Вы не смотрите на «изображения» контейнера. Вы просматриваете «слои» изображения. Комбинация слоев приводит к созданию изображения контейнера. Это также могут быть артефакты для облачной сборки и т. Д.

Вы не можете напрямую изменять слой в реестре артефактов. Любые изменения, которые вы вносите в создание изображения, приведут к изменению одного или нескольких слоев и созданию одного или нескольких новых слоев. Создание изображения обычно не приводит к изменению всех слоев. Ваше новое изображение, вероятно, является результатом старых и новых слоев. Слои кэшируются в реестре артефактов для будущих изображений / сборок.

Несколько изображений контейнера могут использовать одни и те же слои. Если бы Google разрешил вам изменять отдельные слои, вы бы сломали / повредили результирующие контейнеры.