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 など別の場所にある場合は、Settings → Build → zbpack options でエントリーを設定します。
sh
ZBPACK_GO_ENTRY=./cmd/serverモノレポなら、代わりにサービスの Root Directory を go.mod のあるフォルダーにしてください。
デプロイ
- Add Service → GitHub で、リポジトリとブランチを選びます。
- Next をクリックし、プレビューに go と Go のバージョンが表示されていることを確認して Deploy をクリックします。
- Networking タブでドメインを生成します。
データベースに接続する
プロジェクトに 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 から決まります。
よくある問題
| 症状 | 原因 |
|---|---|
| デプロイが healthy にならない | サーバーが 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 をコピーしてください。 |