使用 Compose 部署服務

本頁說明如何使用以 Compose 規格為基礎的檔案,將服務部署到 Cloud Run。

您可以使用下列方式,透過 Compose 檔案部署至 Cloud Run:

使用 Compose 部署至 Cloud Run 非常適合開發,且可簡化從本機環境到雲端環境的轉換。無論是本機或已部署的應用程式,您都能維持一致的設定格式。

如要在基礎架構即程式碼 (IaC) 環境中管理實際工作環境,建議使用 Terraform

限制

  • Compose 部署作業會部署具有多個容器的單一 Cloud Run 服務。
  • Compose 部署作業只會轉換部分支援的 Cloud Run 功能
  • 使用 Compose 建立的服務預設會設為最多 1 個執行個體
  • 雖然 Cloud Run Compose 部署作業簡化了部署程序,但無法取代生產環境的完整基礎架構即程式碼策略。

使用 Compose 從容器映像檔部署服務

compose.yaml 檔案中定義服務,並從現有的容器映像檔部署服務。詳情請參閱「部署容器映像檔」。

範例:單一服務應用程式

以下範例顯示使用預先建構容器映像檔的網路服務 compose.yaml 檔案。

services:
  web:
    image: us-docker.pkg.dev/cloudrun/container/hello
    ports:
      - "8080:8080"

範例:含有 Nginx、Flask 和 MongoDB 的多容器應用程式

以下範例顯示應用程式的 compose.yaml 檔案,該應用程式具有 Nginx Proxy、Flask 後端和 MongoDB 資料庫。

部署這個範例需要下列專案結構:

  • compose.yaml:定義服務的 Compose 檔案。
  • nginx/nginx.conf: Nginx Proxy 的設定。
  • flask/:包含 Flask 應用程式程式碼 (server.pyDockerfilerequirements.txt) 的目錄。
services:
  web:
    image: nginx
    volumes:
      - ./nginx/nginx.conf:/tmp/nginx.conf
    environment:
      - FLASK_SERVER_ADDR=backend:9091
    command: /bin/bash -c "envsubst < /tmp/nginx.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
      - 80:80
    x-google-cloudrun:
      ingress-container: true
    depends_on:
      - backend

  backend:
    build:
      context: flask
      target: builder
    stop_signal: SIGINT
    environment:
      - FLASK_SERVER_PORT=9091
    volumes:
      - ./flask:/src
    depends_on:
      -  mongo
    ports:
      - 9091:9091

  mongo:
    image: mongo
    ports:
      - 27017:27017

部署服務

  1. 如要部署服務,請執行 gcloud run compose up 指令:

    gcloud run compose up compose.yaml

  2. 回應y安裝必要元件或啟用 API 的任何提示。

  3. 選用:公開發布服務,允許未經驗證的存取。

    部署完成後,畫面會顯示 Cloud Run 服務網址。複製這個網址並貼到瀏覽器,即可查看正在執行的容器。您可以在 Google Cloud 控制台停用預設驗證。

使用 Compose 從來源部署

compose.yaml 檔案中定義服務,然後從原始碼建構並部署服務。詳情請參閱「從原始碼部署服務」。

範例:單一服務應用程式

以下範例顯示從目前目錄中的來源建構的 Web 服務 compose.yaml 檔案。

services:
  web:
    build: .
    ports:
      - "8080:8080"

部署服務

  • 在專案目錄中,建立包含服務定義的 compose.yaml 檔案。

    1. 如要部署服務,請執行 gcloud run compose up 指令:

      gcloud run compose up compose.yaml
    2. 回應任何提示,安裝必要元件或啟用 API。y

    3. 選用:公開發布服務,允許未經驗證的存取。

    部署完成後,畫面會顯示 Cloud Run 服務網址。複製這個網址並貼到瀏覽器,即可查看正在執行的容器。您可以在 Google Cloud 控制台停用預設驗證。

強制重新建構

根據預設,如果來源程式碼自上次建構後未變更,Cloud Run Compose 部署作業會略過建構程序。如要強制重建以 build 設定定義的任何服務,請使用 --build 旗標,如下所示:

gcloud run compose up compose.yaml --build

如果遠端存放區、映像檔或摘要已遭刪除,但本機原始碼維持不變,這項功能就特別實用。--build--no-build 旗標互斥。

支援功能

使用 compose.yaml 檔案部署時,Cloud Run 會自動佈建 Compose 檔案中定義的其他 Google Cloud 資源。如果需要資源,Cloud Run 會先提示您同意,再建立資源。

Cloud Run 支援下列 Compose 功能子集:

撰寫欄位 Cloud Run 對應和說明
services

服務會對應至已部署 Cloud Run 服務中的個別容器。

volumes

部分支援。將 bindvolumetmpfs 掛接點轉換為 Cloud Run 對應項目。

secrets

支援。使用 Secret Manager。

configs

支援。使用 Cloud Storage。

build

支援。使用建構環境建構容器,並加上標記,然後推送至 Artifact Registry 中的 cloud-run-source-deploy 存放區。即使原始碼自上次建構後未變更,您也可以使用 --build 標記強制重新建構。

image

從支援的登錄檔部署預先建構的容器映像檔。如果您有預先建立的映像檔,請使用這個選項。僅支援 Docker Hub 和 Artifact Registry 映像檔。如要使用自訂映像檔,可以將映像檔推送至 Artifact Registry。

ports

通訊埠對應清單,例如 8080:8080,用於決定輸入容器。

expose

要公開但不發布的通訊埠清單,例如 3000,確保相依服務有可用的通訊埠。

depends_on

定義容器啟動順序。這可確保任何run-compose列出的服務都有 portsexpose定義的通訊埠,以便其他容器與其通訊。

cpus

用來設定 Cloud Run CPU 和記憶體限制的提示,系統會根據下列邏輯自動分配資源:

  • <= 2 CPU: 1Gi Memory
  • <= 4 CPU: 2Gi Memory
  • > 4 CPU: 4Gi Memory
container_name

設定容器的依附元件解析名稱,如未指定,預設為服務名稱。

environment

將環境變數傳遞至 Cloud Run 中的對應容器。

command

透過對應至 Cloud Run 中的 args 屬性,覆寫容器宣告的容器預設指令;例如 Dockerfile 的 CMD 指令。

entrypoint

支援。

env_file

支援。

x-google-cloudrun:ingress-container

(擴充功能) 將這項 Google 專屬擴充功能新增至服務,並設為 true,標示為接收所有外部流量的進入容器。

x-google-cloudrun:volume-type: in-memory

(擴充功能) 將這個 Google 專屬擴充功能新增至磁碟區,並設為 in-memory,而非 Cloud Storage 支援的預設磁碟區。

對應至 Secret Manager 的密鑰

如果 compose.yaml 檔案定義 secrets,gcloud CLI 會佈建 Secret Manager 密鑰來儲存這項資料。

對應至 Cloud Storage 的磁碟區和設定

如果 compose.yaml 檔案定義了頂層 volumesconfigs,gcloud CLI 會佈建 Cloud Storage 值區來管理這項資料。每個部署作業都會建立一個 bucket,並使用資料夾分隔磁碟區和設定。

  • 具名磁碟區:系統會在 bucket 中建立與磁碟區名稱對應的空白資料夾。
  • 繫結掛接:如果是繫結掛接,Cloud Run 會先將本機來源目錄的內容上傳至 bucket 中的資料夾,再進行部署。
  • 設定:針對以 file: 來源定義的每個設定,Cloud Run 會將本機檔案的內容上傳至 bucket 中的資料夾。

必要的角色

部署期間,Cloud Run 會自動授予已部署服務的服務身分,存取已佈建資源所需的角色:

  • Cloud Storage 值區roles/storage.objectUser
  • Secret Manager 密鑰roles/secretmanager.secretAccessor

同一執行個體的容器之間通訊

Cloud Run 會在每個容器的 /etc/hosts 檔案中新增項目。這個項目會將 compose.yaml 檔案中的服務名稱對應至內部 IP 位址,讓服務能使用服務名稱彼此通訊。

後續步驟