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。 |