簡體   English   中英

如何在 Google Cloud Build 中構建 Docker 映像並在后續構建步驟中使用?

[英]How can I build a Docker Image in Google Cloud Build and use in later Build Steps?

在我的 Rails 項目中,我在存儲庫中有一個 Docker 圖像,用於數據庫遷移和單元測試。 在運行遷移/測試之前,我可能需要更新圖像上的 gem。 但是,似乎即使在更新 Gems 之后,更新的圖像(未推送到存儲庫,而是在遷移/測試之前的構建步驟中)也無法用於未來的構建步驟。

我的 cloudbuild.yaml 看起來像這樣:

steps:
  - id: update_gems
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'build', '-t', "us-central1-docker.pkg.dev/$PROJECT_ID/myregistry/myimage:deploy",
            '--build-arg', 'PROJECT=${PROJECT_ID}', '-f', 'docker/bundled.Dockerfile', '.' ]
  - id: db_migration
    name: "gcr.io/google-appengine/exec-wrapper"
    args: ["-i", "us-central1-docker.pkg.dev/$PROJECT_ID/myregistry/myimage:deploy",
           "-e", "RAILS_ENV=${_RAILS_ENV}",
           "-e", "INSTANCE_CONNECTION_NAME=${_INSTANCE_CONNECTION_NAME}",
           "-s", "${_INSTANCE_CONNECTION_NAME}",
           "--", "./bin/rake", "db:migrate"]
  - id: unit_test
    name: "gcr.io/google-appengine/exec-wrapper"
    args: ["-i", "us-central1-docker.pkg.dev/$PROJECT_ID/myregistry/myimage:deploy",
           "-e", "RAILS_ENV=test", 
           "-e", "INSTANCE_CONNECTION_NAME=${_INSTANCE_CONNECTION_NAME}",
           "-s", "${_INSTANCE_CONNECTION_NAME}",
           "--", "./bin/rspec"]
  - id: deploy_to_GAE
    name: gcr.io/cloud-builders/gcloud
    args: ['app', 'deploy', '--project', '${PROJECT_ID}', 'app.yaml']

第一步中提到的Dockerfile如下所示:

ARG PROJECT
FROM us-central1-docker.pkg.dev/${PROJECT}/myregistry/myimage:deploy
WORKDIR /workspace
ADD Gemfile* ./
RUN bundle update
RUN bundle install

在觸發的 Cloud Build 期間,我看到它更新了 Gems 並創建了一個新的 hash,如下所示: 更新的寶石

然后在db_migration步驟中,我看到它在 Gems 更新之前提取了舊圖像: 使用舊映像進行數據庫遷移

這可以在update_gems步驟日志中驗證,其中預更新的圖像 hash 匹配(即圖像 hash 是新拉的,但尚未更新其 Gems): 寶石前更新

我意識到一種解決方法是在構建后推送更新的圖像,這確實有效。 例如,我可以在update_gems步驟之后添加此步驟:

  - id: update_image
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'push',  'us-central1-docker.pkg.dev/$PROJECT_ID/myregistry/myimage:deploy' ]

然而,它引出了一個問題,為什么新的udate_image構建步驟可以訪問由update_gems步驟構建的圖像,而其他未來步驟則不能。

映像存儲在本地 docker 注冊表中,Docker 可以訪問。 這就是為什么您可以使用 Docker 推動它的原因。

但是,當您使用另一個步驟時,例如gcr.io/google-appengine/exec-wrapper ,Docker 不再加載到運行時上下文中,因此本地 docker 注冊表是未知的/不活動的。

所以,解決方案是:

  • 要么從外部推送圖像,然后使用它。 像這樣,它不是本地注冊表,而是使用的外部注冊表,它可以在任何步驟中工作。
  • 或者在您當前的運行時步驟映像上安裝 docker(或使用 Docker 作為步驟映像並在此映像上安裝您需要的內容)-> 這會很困難,我不推薦這種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM