Build and Push a Container Image
Cloud Run 可以直接部署 container image。常見的做法是:先在本地建立 Docker image,推送到 Artifact Registry,再讓 Cloud Run 以該 image 建立 Service 或 Job。
Architecture
Dockerfile + source code
│
▼
Local Docker image
│ docker push
▼
Artifact Registry
│
▼
Cloud Run Service / Job
Artifact Registry 是 Google Cloud 的私有 artifact repository,可以儲存 Docker image 與其他套件格式。Cloud Run 部署時會從 registry 讀取 image。
Step 1: Enable APIs
gcloud config set project PROJECT_ID
gcloud services enable \
artifactregistry.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com
確認目前 Project:
gcloud config get-value project
Step 2: Prepare a Simple Web Application
建立 app.py:
import os
from flask import Flask
app = Flask(__name__)
@app.get("/")
def hello():
return {"message": "Hello from Cloud Run"}
if __name__ == "__main__":
port = int(os.environ.get("PORT", "8080"))
app.run(host="0.0.0.0", port=port)
建立 requirements.txt:
Flask==3.*
gunicorn==23.*
建立 Dockerfile:
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
ENV PYTHONUNBUFFERED=1
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
CMD 使用 $PORT,讓同一個 image 可以配合 Cloud Run 的 port 設定。
Step 3: Test the Image Locally
建立 image:
docker build -t cloud-run-demo:local .
在本地啟動:
docker run --rm \
-e PORT=8080 \
-p 8080:8080 \
cloud-run-demo:local
另一個 terminal 測試:
curl http://localhost:8080/
預期會看到:
{"message":"Hello from Cloud Run"}
如果本地 container 無法啟動,先修正 Docker 或 application 問題,再部署到 Cloud Run。不要把雲端部署當成本地除錯工具。
Step 4: Create an Artifact Registry Repository
在 Console 中:
- 開啟 Artifact Registry。
- 點選 Create repository。
- Name 輸入
tkr101-repo。 - Format 選擇 Docker。
- Location 選擇與 Cloud Run 相容的 Region,例如
asia-east1。 - 點選 Create。
使用 CLI:
gcloud artifacts repositories create tkr101-repo \
--repository-format=docker \
--location=asia-east1 \
--description="TKR101 Cloud Run images"
查看 repository:
gcloud artifacts repositories list \
--location=asia-east1
Step 5: Configure Docker Authentication
gcloud auth login
gcloud auth configure-docker asia-east1-docker.pkg.dev
這會把 Artifact Registry host 加入 Docker credential helper 設定。不要把長期服務帳號 JSON key 寫進 Docker config 或 repository。
Step 6: Tag the Image
Artifact Registry Docker image URI 格式如下:
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG
標記本地 image:
docker tag cloud-run-demo:local \
asia-east1-docker.pkg.dev/PROJECT_ID/tkr101-repo/cloud-run-demo:v1
Step 7: Push the Image
docker push \
asia-east1-docker.pkg.dev/PROJECT_ID/tkr101-repo/cloud-run-demo:v1
確認 image:
gcloud artifacts docker images list \
asia-east1-docker.pkg.dev/PROJECT_ID/tkr101-repo
Apple Silicon Build Note
Apple Silicon Mac 預設可能建立 arm64 image。Notebook 課程示範使用 linux/amd64,目的是確保 image 與目標 Cloud Run runtime、base image 及相依套件的架構相容。
可以使用 buildx 直接跨平台 build 並 push:
docker buildx build \
--platform linux/amd64 \
-t asia-east1-docker.pkg.dev/PROJECT_ID/tkr101-repo/cloud-run-demo:v1 \
. \
--push
不要只根據「本地 Docker build 成功」判斷雲端一定能執行。若使用原生套件、特殊 base image 或多架構 deployment,請先查看目前 Cloud Run 與該 image 的架構支援狀態。
Image Checklist
- Application 監聽
0.0.0.0。 - 使用
PORTenvironment variable。 - Image 可以在本地啟動並通過
curl。 - Image URI 包含正確的 Project、repository、tag。
- Artifact Registry 與 Cloud Run location 設計相容。
- 沒有把 API key 或密碼寫進 image layer。
- Apple Silicon build 已確認目標架構。
- image tag 可以對應到可追蹤的版本或 commit。