從原始碼部署服務

本頁面說明如何使用單一 gcloud CLI 指令,直接從原始碼將新服務或服務修訂版本部署到 Cloud Run, gcloud run deploy 並搭配 --source 旗標。如需部署 Hello World 服務的範例逐步說明,請參閱從來源部署快速入門

這項功能有兩種使用方式:

請注意,來源部署會使用 Artifact Registry 儲存建構的容器。如果專案在您要部署的區域中,還沒有名為 cloud-run-source-deploy 的 Artifact Registry 存放區,這項功能會自動建立名為 cloud-run-source-deploy 的 Artifact Registry 存放區。

如果原始碼目錄中含有 Dockerfile,系統會使用該 Dockerfile 建構上傳的原始碼。如果原始碼目錄中沒有 Dockerfile,Google Cloud 的 Buildpacks 會自動偵測您使用的語言,並擷取程式碼的依附元件,使用 Google 管理的安全基礎映像檔,製作可立即用於實際工作環境的容器映像檔。

根據預設,只有在部署 Cloud Run 服務時,系統才會套用安全性修正程式。為服務啟用自動安全性更新後,該服務就會自動接收修補程式,完全不需要停機。進一步瞭解如何設定安全性更新

事前準備

  • 請確認您已按照設定頁面所述,為 Cloud Run 設定新專案。
  • 如果您受到網域限制組織政策限制,專案無法進行未經驗證的呼叫,則必須按照「測試私人服務」一節的說明存取已部署的服務。

  • Enable the Cloud Run Admin API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

    啟用 Cloud Run Admin API 後,系統會自動建立 Compute Engine 預設服務帳戶。

必要的角色

如要從來源部署,您或管理員必須授予部署者帳戶下列 IAM 角色。

按一下即可查看部署者帳戶的必要角色

如要取得從來源建構及部署所需的權限,請要求管理員授予下列 IAM 角色:

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

支援的語言

除了使用 Dockerfile 的來源,從來源部署也支援下列語言,方法是使用 Google Cloud 的 Buildpacks

執行階段 來源部署作業 建構套件設定
Go 部署 Go 服務 設定 Go 建構包
Node.js 部署 Node.js 服務 設定 Node.js 建構套件
Python 部署 Python 服務 設定 Python 建構包
Java
(包括 Kotlin、Groovy、Scala)
部署 Java 服務 設定 Java 建構套件
.NET 部署 .NET 服務 設定 .NET 建構套件
Ruby 部署 Ruby 服務 設定 Ruby 建構套件
PHP 部署 PHP 服務 設定 PHP 建構套件

進一步瞭解支援的語言版本

從來源部署並建構

本節說明如何使用 Google Cloud 的 Buildpacks 和 Cloud Build,從原始碼自動建構容器映像檔,而不必在機器上安裝 Docker,或設定 Buildpacks 或 Cloud Build。

限制

  • 從來源部署功能會使用 Artifact Registry 和 Cloud Build,因此這項功能僅適用於 Artifact Registry 支援的區域Cloud Build
  • 從來源部署是便利的功能,但無法完全自訂建構作業。如要進一步控管,請使用 Cloud Build 建構容器映像檔 (例如使用 gcloud builds submit),然後使用 gcloud run deploy --image 等工具部署容器映像檔
  • 使用 Google Cloud 的建構套件從來源部署時,來源檔案的上次修改日期會設為 1980 年 1 月 1 日。這是建構套件的預設行為,旨在支援可重現的建構作業。視您的語言架構而定,這可能會影響瀏覽器端靜態檔案的快取。如果您的應用程式受到影響,Google 建議在應用程式中停用 etagLast-Modified HTTP 標頭。
  • 使用 Google Cloud 的 Buildpack 從來源部署時,一律會使用 gcr.io/buildpacks/builder:latest。 如果 latest 未提供偏好的語言或 OS 設定,請使用特定建構工具,透過偏好的建構工具建立應用程式映像檔。
  • 您可以使用 Kotlin 和其他 JVM 語言 (例如 Java),從來源部署服務。使用的語言必須符合下列規則:

    • 您可以使用 Maven 或 Gradle 建構應用程式。
    • 建構檔案包含產品類別所需的所有外掛程式。

使用建構作業部署前

從來源部署並建構前,請先完成下列事項:

  • 請按照「事前準備」中的步驟操作。

  • Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

必要的角色

如要透過建構作業從來源部署,您或管理員必須將下列 IAM 角色授予 Cloud Build 服務帳戶。

按一下即可查看 Cloud Build 服務帳戶的必要角色

根據預設,Cloud Build 會自動使用 Compute Engine 預設服務帳戶做為預設的 Cloud Build 服務帳戶,用來建構您的原始碼和 Cloud Run 資源,除非您覆寫這項行為。如要讓 Cloud Build 建構來源,請要求管理員將Cloud Run 建構工具 (roles/run.builder) 授予專案中的 Compute Engine 預設服務帳戶:

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

請將 PROJECT_NUMBER 替換為專案編號,並將 PROJECT_ID 替換為專案 ID。 Google CloudGoogle Cloud如需如何找出專案 ID 和專案編號的詳細操作說明,請參閱「建立及管理專案」。

將 Cloud Run 建構工具角色授予 Compute Engine 預設服務帳戶後,需要幾分鐘才能傳播

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

使用建構作業部署

如要從原始碼部署,請按一下分頁標籤,瞭解如何使用自選工具。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 變更為來源目錄。來源目錄會使用 Dockerfile (如有),但這並非必要。

  3. 建構及部署服務:

    gcloud run deploy SERVICE --source .

    SERVICE 替換為您想要的服務名稱。

  4. 系統提示安裝必要 API 時,請輸入 y。這項操作只需要為專案執行一次。如果尚未如設定頁面所述,為平台和區域設定預設值,請提供這些資訊,回應其他提示。

  5. 等待建構及部署作業完成。完成後,Cloud Run 會顯示成功訊息。

  6. 部署完成後,這個服務修訂版本會處理 100% 的流量。

    Cloud Code

    如要使用 Cloud Code 從來源部署,請參閱 IntelliJVisual Studio Code 指南。

    Gemini CLI

    使用 Gemini CLI 工具中的 /deploy 指令,從原始碼部署 Cloud Run 服務。

    如要搭配使用 Gemini CLI 與 Cloud Run 擴充功能,請按照下列步驟操作:

    1. 在下列其中一種開發環境中,安裝最新版 Gemini CLI

      • 終端機
      • Cloud Shell
      • 在 VS Code 中使用 Gemini Code Assist 代理人模式 (請參閱「VS Code」分頁)
    2. 安裝 Cloud Run 擴充功能:

      gemini extensions install https://github.com/GoogleCloudPlatform/cloud-run-mcp
    3. 登入 Google Cloud CLI:

      gcloud auth login
    4. 設定應用程式預設憑證:

      gcloud auth application-default login
    5. 變更為原始碼目錄。

    6. 啟動 Gemini CLI:

      gemini
    7. 建構及部署服務:

      /deploy
      • 如果系統提示您提供 Google Cloud 專案,請輸入專案名稱。
      • 如果系統提示您選取工具,請選取「deploy_local_folder」。
    8. 等待建構及部署作業完成。完成後,Cloud Run 會顯示成功訊息。

    MCP

    如要從 Model Context Protocol (MCP) 用戶端的原始碼部署 Cloud Run 服務,請安裝 Cloud Run Model Context Protocol (MCP) 伺服器

    安裝說明會因 MCP 用戶端而異。通常需要將下列程式碼行新增至設定 JSON 檔案:

    "mcpServers":{
      "cloud-run": {
        "command": "npx",
        "args": ["-y", "@google-cloud/cloud-run-mcp"]
      }
    }

    撰寫

    您可以將 Compose 規格儲存在 YAML 檔案中,然後使用單一 gcloud 指令,從原始碼將其部署為 Cloud Run 服務。

    1. 變更為來源目錄。來源目錄會使用 Dockerfile (如有),但這並非必要。

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

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

      您也可以指定更多設定選項,例如環境變數、密鑰和磁碟區掛接。

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

      gcloud beta run compose up compose.yaml
    4. 回應所有提示,安裝必要元件或啟用 API。y

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

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

從來源部署,但不建構

您可以將來源構件直接部署至 Cloud Run,略過 Cloud Build 步驟。具體來說,您可以直接將預先封裝的應用程式封存檔上傳至 Cloud Storage bucket,不必從來源建立容器映像檔。Cloud Run 接著會取得這個封存檔,並直接在基礎映像檔上執行。這種做法可大幅縮短部署時間。

限制

部署至來源 (不含建構作業) 僅支援下列項目:

  • Cloud Run 服務。
  • 支援的執行階段 (不支援 Dockerfile)。
  • 來源封存檔 (.tar.gz) <= 250 MiB。
  • 二進位檔 (例如 Go 二進位檔) 或指令碼 (例如 Python 指令碼) 必須與 x86 架構相容。
  • 來源必須是獨立性質,並封裝所有依附元件。執行階段基礎映像檔只包含最少的作業系統和幾個語言程式庫。

在不建構的情況下部署

如要使用「deploy without build」功能,請按照下列步驟操作:

  • 請確認您已按照「事前準備」一節中的步驟操作。
  • 啟用 Cloud Run 和 Cloud Storage API:

    gcloud services enable run.googleapis.com \
      storage.googleapis.com
    
  • 您必須先在本機安裝應用程式依附元件,才能部署應用程式,因為系統不會安裝這些元件 (不會建構)。

不建構就部署

本節說明如何直接將構件部署至 Cloud Run,而不使用建構作業。

gcloud

如要部署本機來源目錄,請使用 --no-build 標記,告知 deploy 指令略過 Cloud Build 步驟:

gcloud beta run deploy SERVICE_NAME \
  --source APPLICATION_PATH \
  --no-build \
  --base-image=BASE_IMAGE \
  --command=COMMAND \
  --args=ARG

更改下列內容:

  • SERVICE_NAME:Cloud Run 服務名稱。
  • APPLICATION_PATH:應用程式在本地檔案系統中的位置。
  • BASE_IMAGE:要用於應用程式的執行階段基礎映像檔。例如:us-central1-docker.pkg.dev/serverless-runtimes/google-24-full/runtimes/nodejs24
  • COMMAND:容器啟動時執行的指令。
  • ARG:傳送至容器指令的引數。如果使用多個引數,請在各自的行中指定每個引數。

YAML

您可以將服務規格儲存在 YAML 檔案中,然後使用 gcloud CLI 或 Google Cloud 控制台service.yaml編輯器部署。

  1. 建立儲存空間值區來存放應用程式:

    gcloud storage buckets create gs://BUCKET_NAME --location=BUCKET_LOCATION
    

    更改下列內容:

    • BUCKET_NAME:您要授予 bucket 的名稱,必須遵守命名要求。例如:my-bucket
    • BUCKET_LOCATION:值區的位置。例如:US
  2. 使用 zip 或 tar 建立應用程式來源的封存檔, 例如:

    tar -cvzf ARCHIVE_NAME APPLICATION_PATH
    

    更改下列內容:

    • ARCHIVE_NAME:要建立的封存檔名稱。例如:app.tar.gz
    • APPLICATION_PATH:應用程式在本機檔案系統中的位置。例如:~/my-application。如要封存目前的工作目錄,請將這個值設為 *
  3. 將應用程式封存檔上傳至 Cloud Storage:

    gcloud storage cp ARCHIVE_NAME gs://BUCKET_NAME
    

    更改下列內容:

    • ARCHIVE_NAME:先前建立的封存檔本機路徑。例如:app.tar.gz
    • BUCKET_NAME:您先前建立的 bucket 名稱。例如:my-bucket
  4. 建立新的 service.yaml 檔案,並加入以下內容:

    apiVersion: serving.knative.dev/v2
    kind: Service
    metadata:
     name: SERVICE_NAME
    spec:
     template:
       metadata:
         annotations:
           run.googleapis.com/sources: '{"": "gs://BUCKET_NAME/ARCHIVE_NAME"}'
           run.googleapis.com/base-images: '{"": "BASE_IMAGE"}'
       spec:
         containers:
         - image: scratch
           command:
           - COMMAND
           args:
           - ARG1
           - ARG-N
         runtimeClassName: run.googleapis.com/linux-base-image-update
    

    更改下列內容:

    • SERVICE_NAME:Cloud Run 服務名稱。服務名稱長度不得超過 49 個字元,且每個區域和專案的服務名稱都必須是唯一的。
    • BUCKET_NAME:您先前建立的 bucket 名稱。例如:my-bucket
    • ARCHIVE_NAME:先前建立的封存檔本機路徑。例如:app.tar.gz
    • BASE_IMAGE:要用於應用程式的執行階段基礎映像檔。例如:us-central1-docker.pkg.dev/serverless-runtimes/google-24-full/runtimes/nodejs24
    • COMMAND:容器啟動時執行的指令。
    • ARG1:傳送至容器指令的引數。如果使用多個引數,請在各自的行中指定,例如 ARG-N 所示。
  5. 部署新服務:

    gcloud run services replace service.yaml
    

REST API

REST API:

curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-X POST \
-d '{"template": {"containers": [{"command": ["npm"], "args": ["start"], "image": "scratch", "baseImageUri": "google-22/nodejs22", "sourceCode": {"cloudStorageSource": {"bucket": "'GCS_BUCKET_NAME", "object":"ARCHIVE"}}}]}}' \
https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services?serviceId=SERVICE_NAME

從來源部署但不建構的範例

本節將舉例說明如何從來源部署,而不使用建構作業。

Node.js

建立 Node.js 服務:

  1. 建立名為 helloworld 的新目錄,然後將目錄變更為該目錄:

    mkdir helloworld
    cd helloworld
    
  2. 使用以下內容建立 package.json 檔案:

    {
      "name": "helloworld",
      "description": "Simple hello world sample in Node",
      "version": "1.0.0",
      "private": true,
      "main": "index.js",
      "type": "module",
      "scripts": {
        "start": "node index.js"
      },
      "engines": {
        "node": ">=16.0.0"
      },
      "author": "Google LLC",
      "license": "Apache-2.0",
      "dependencies": {
        "express": "^4.17.1"
      }
    }
    
  3. 在同一個目錄中建立 index.js 檔案,然後將以下幾行複製到檔案中:

    import express from 'express';
    const app = express();
    
    app.get('/', (req, res) => {
      const name = process.env.NAME || 'World';
      res.send(`Hello ${name}!`);
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, () => {
      console.log(`helloworld: listening on port ${port}`);
    });

    這段程式碼會建立基本的網路伺服器,用於監聽 PORT 環境變數定義的通訊埠。

  4. helloworld 目錄中執行下列指令,在本機安裝服務依附元件:

    npm install
  5. helloworld 目錄中,使用 --no-build 標記部署服務,這個標記會告知 deploy 指令略過 Cloud Build 步驟:

    gcloud beta run deploy helloworld \
     --source . \
     --region=REGION \
     --no-build \
     --base-image=nodejs24 \
     --command=node \
     --args=index.js
     

    更改下列內容:

    • REGION:服務部署的區域。

Python

建立 Python 服務:

  1. 建立名為 helloworld 的新目錄,然後將目錄變更為該目錄:

    mkdir helloworld
    cd helloworld
    
  2. 建立名為 main.py 的檔案,將下列程式碼貼入其中:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def hello_world():
        """Example Hello World route."""
        name = os.environ.get("NAME", "World")
        return f"Hello {name}!"
    
    
    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

    這段程式碼會以「Hello World」問候語回應要求。容器中的 Gunicorn 網路伺服器會處理 HTTP。直接收到本機環境叫用之後,這個程式碼會建立基本的網路伺服器,以便監聽 PORT 環境變數定義的通訊埠。

  3. 建立名為 requirements.txt 的檔案,將下列程式碼貼入其中:

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
    

    這段程式碼會新增範例所需的套件。

  4. 提供依附元件:

    pip3 install -r requirements.txt --target=./vendor
    
  5. 使用 gcloud CLI 部署服務。--no-build 標記會告知 deploy 指令略過 Cloud Build 步驟:

    gcloud beta run deploy helloworld \
      --source . \
      --region=REGION \
      --no-build \
      --base-image=python313 \
      --command=python \
      --args=main.py \
      --set-env-vars PYTHONPATH=./vendor
    

REGION 改成服務部署的區域。

疑難排解

本節提供一些提示,說明如何排解不使用建構程序,直接從來源部署的問題。

本機開發

從原始碼部署而不使用建構功能,與將程式碼或可執行檔掛接到基礎映像檔類似。

例如:

  1. 複製所有內容:

    cp -R python/hello-world/ workspace
  2. 以根使用者身分執行基本映像檔,並掛接來源。如要從主機電腦使用 curl,可以視需要加入 -p 8080:8080

    docker run -it -v "LOCAL_PATH" -u 0 us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/python313 /bin/bash`

    LOCAL_PATH 替換為本機來源檔案的位置。

  3. 執行伺服器:

    python main.py

執行記錄

執行記錄有助於排解部署失敗問題。在 Google Cloud 控制台中,依序前往「可觀測性」>「記錄」

Cloud Storage 存取權遭拒

如果 Cloud Run 服務嘗試存取 Cloud Storage 物件時發生「權限遭拒」錯誤,您必須將 roles/storage.objectViewer 角色授予 Cloud Run 服務帳戶:

gcloud projects add-iam-policy-binding PROJECT \
  --member="SERVICE_ACCOUNT" \
  --role="roles/storage.objectViewer"

更改下列內容:

  • PROJECT:您的 Google Cloud 專案 ID。
  • SERVICE_ACCOUNT:您的 Cloud Run 服務帳戶。 例如:service-123@serverless-robot-staging.iam.gserviceaccount.com

自動從來源建構

為避免本機來源中出現未納入版本的變更,Google 建議您在變更推送至 Git 存放區時,自動進行部署。為簡化這項作業,您可以連結 Cloud Run 服務並設定持續部署。將 GitHub 存放區連結至 Cloud Run 後,您就能設定建構作業並部署存放區,不必編寫 Dockerfile 或建構檔案。

如要設定自動建構,請按照持續建構頁面所述設定自動化,並務必選擇使用建構套件建構來源的選項。

後續步驟

部署 Cloud Run 服務後,您可以執行下列操作:

瞭解來源部署設定:

您可以使用 Cloud Build 觸發條件,自動執行 Cloud Run 服務的建構和部署作業: