想透過簡單的指令,快速構建並部署程式碼到 Cloud Run 嗎?使用 Cloud Run,您不必建立、管理 Kubernetes 節點,即可執行容器化應用程式、快速將容器化映像檔轉到完全託管的 Web 應用程式,該應用程式也會在具有 TLS 憑證的網域上運行,並根據請求自動擴展。

在全代管的無伺服器平台上,您可以使用自己慣用的程式語言 (如:Go、Python、Java、Node.js、NET 等) 開發及部署具備高擴充性的容器化應用程式,且所有 Google Cloud 客戶每月可發出 200 萬次免費請求。當然,您僅須支付程式碼運作期間的費用。就讓宏庭科技架構師手把手帶您深入了解 Cloud Run 該怎麼建置與自動化部署吧!

 

如何從 Cloud Shell Editor 連到 GCP 專案?

Step 1:首先,請點擊這邊進入 Cloud Shell Editor

Cloud Run-1

Step 2:輸入下面的指令來連到專案(Project),[PROJECT_ID]請填入專案ID

gcloud config set project [PROJECT_ID]

Step 3:點擊Authorize

Step 4:設定完成後會像下面這樣,出現黃色的括弧

 

如何撰寫 Demo 程式?

Step 1:創建一個 helloworld 資料夾,並切換進去

mkdir helloworld

cd helloworld

Step 2:由於我們的 Demo 是要採用 GO 語言來開發,所以這邊我們需要下面的指令去初始化 go.mod 以聲明 go module

go mod init demo

demo:這個參數可以替換成你想要的命名

Step 3:接著我們需要建立我們的主程式 main.go

vi main.go

Step 4:輸入以下程式碼。這段程式碼是在創建一個基本的 Web Server,並監聽 PORT 這個環境變數定義的端口。

// Sample run-helloworld is a minimal Cloud Run service.

package main

 

import (

     “fmt”

     “log”

     “net/http”

     “os”

)

 

func main() {

     log.Print(“starting server…”)

     http.HandleFunc(“/”, handler)

 

     // Determine port for HTTP service.

     port := os.Getenv(“PORT”)

     if port == “” {

             port = “8080”

             log.Printf(“defaulting to port %s”, port)

     }

 

     // Start HTTP server.

     log.Printf(“listening on port %s”, port)

     if err := http.ListenAndServe(“:”+port, nil); err != nil {

             log.Fatal(err)

     }

}

 

func handler(w http.ResponseWriter, r *http.Request) {

     name := os.Getenv(“NAME”)

     if name == “” {

             name = “World”

     }

     fmt.Fprintf(w, “Hello %s!\n”, name)

}

如何將程式容器化並上傳到 Container Registry?

接下來我們就可以將這段程式碼打包成 container,並上傳到Container Registry之中。

Step 1:首先我們需要創建一個 Dockerfile 文件

vi Dockerfile

Step 2:貼上以下內容

# Use the offical golang image to create a binary.

# This is based on Debian and sets the GOPATH to /go.

# https://hub.docker.com/_/golang

FROM golang:1.15-buster as builder

 

# Create and change to the app directory.

WORKDIR /app

 

# Retrieve application dependencies.

# This allows the container build to reuse cached dependencies.

# Expecting to copy go.mod and if present go.sum.

COPY go.* ./

RUN go mod download

 

# Copy local code to the container image.

COPY . ./

 

# Build the binary.

RUN go build -mod=readonly -v -o server

 

# Use the official Debian slim image for a lean production container.

# https://hub.docker.com/_/debian

# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds

FROM debian:buster-slim

RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \

ca-certificates && \

rm -rf /var/lib/apt/lists/*

 

# Copy the binary to the production image from the builder stage.

COPY –from=builder /app/server /app/server

 

# Run the web service on container startup.

CMD [“/app/server”]

Step 3:添加一個 .dockerignore 文件,以從 container image 中排除文件

vi .dockerignore

Step 4:貼上以下內容

# The .dockerignore file excludes files from the container build process.

#

# https://docs.docker.com/engine/reference/builder/#dockerignore-file

 

# Exclude locally vendored dependencies.

vendor/

 

# Exclude “build-time” ignore files.

.dockerignore

.gcloudignore

 

# Exclude git history and configuration.

.gitignore

Step 5:使用 Cloud Build 來建構 container image,方法是從包含 Dockerfile 的目錄中運行下面的指令

gcloud builds submit –tag gcr.io/PROJECT-ID/helloworld

其中 PROJECT-ID 是GCP專案ID,可以透過執行gcloud config get-value project來獲得該ID

Step 6:建置成功後,我們會看到一條包含image名稱 (gcr.io/PROJECT-ID/helloworld) 的SUCCESS訊息。該image是存儲在Container Registry中,並可以根據需求重複使用。

 

如何部署到 Cloud Run?

Step 1:透過以下指令將剛剛建好的 image 部署到 Cloud Run 中

gcloud run deploy –image gcr.io/PROJECT-ID/helloworld –platform managed

Step 2:將 PROJECT-ID 帶入我們的GCP專案ID

Step 3:系統會提示我們輸入服務名稱:按 Enter 接受默認名稱 helloworld

Step 4:系統會提示我們輸入區域:選擇我們所要部署的區域,例如 asia-east1

Step 5:系統會提示我們「是否允許未通過身份驗證的呼叫」,這邊輸入Y

Step 6:部署完畢後,會得到 Cloud Run 的服務網址,可以在瀏覽器中開啟

現在,您已經學會如何打包一個 Container image 並將其部署到 Cloud Run 中運行了。Cloud Run 會在需要處理收到的請求時,自動橫向擴充我們的 Container image,並在需要處理的請求減少時,自動橫向限縮我們的 Container image。

想了解更多 Google Cloud 的隱藏版實用功能,請持續鎖定宏庭架構師專欄,讓您新知訊息接不完喔!