#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 разрешил вам изменять отдельные слои, вы бы сломали / повредили результирующие контейнеры.