Go
最小應用
go
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello from Go")
})
log.Printf("listening on %s", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}":"+port 會在所有網路卡上監聽。Gin 的 r.Run()、Echo 的 e.Start(":"+port) 和 Fiber 的 app.Listen(":"+port) 也是一樣。
Zenavo 識別出的內容
帶有 go.mod 的儲存庫會由 zbpack 建置為 Go。Go 版本取自 go.mod 中的 go 行。建置會執行 go mod download,並以 CGO_ENABLED=0 執行 go build,生成的二進位制檔案執行在一個小巧的 Alpine 映像檔上。
zbpack 建置根目錄中的包。如果 main 在其他位置,例如 cmd/server,請在 設定 → 建置 → zbpack 選項 中設定入口:
sh
ZBPACK_GO_ENTRY=./cmd/server如果是 monorepo,則把服務的 根目錄 設為 go.mod 所在的資料夾。
部署
- 新增服務 → GitHub,選擇儲存庫和分支。
- 點選 下一步,確認預覽顯示 go 以及你的 Go 版本,然後點選 部署。
- 在 網路 分頁生成網域。
連線資料庫
在專案中新增 PostgreSQL,並在 Go 服務中設定:
sh
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}pgx、搭配 lib/pq 的 database/sql、GORM 和 sqlc 都接受這個 URL。
使用自己的 Dockerfile
根目錄中的 Dockerfile 會代替 zbpack 使用,例如需要在二進位制檔案旁放置其他檔案,或者需要用 cgo 建置:
dockerfile
FROM golang:1.26-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /server ./cmd/server
FROM gcr.io/distroless/static-debian12
COPY --from=build /server /server
EXPOSE 8080
ENTRYPOINT ["/server"]服務的連接埠來自 EXPOSE。
常見問題
| 現象 | 原因 |
|---|---|
| 部署一直不健康 | 伺服器監聽的是 localhost:8080,或者忽略了 PORT。請監聽 ":"+os.Getenv("PORT")。 |
no Go files in /src | main 不在根目錄中。設定 ZBPACK_GO_ENTRY 或根目錄。 |
| 二進位制檔案找不到模板或靜態檔案 | zbpack 只把二進位制檔案複製到映像檔中。用 //go:embed 嵌入它們,或者使用 Dockerfile。 |
distroless 或 scratch 映像檔報 x509: certificate signed by unknown authority | 映像檔中沒有 CA 憑證。使用自帶憑證的 distroless/static,或者複製 /etc/ssl/certs。 |