Go アプリをデプロイする
Lizard (lizard.build) に Go アプリをデプロイするには、go.mod ファイルを含むモジュールをアップロードするか push します。lizardpack は go 行の Go バージョンでビルドし、静的バイナリ(CGO_ENABLED=0)をコンパイルして Alpine Linux 上で実行します。サービスポートは 8080 で、Lizard はそれを PORT でプロセスに渡します。PORT を読み取り、すべてのインターフェースで待ち受けてください。
テスト状況: 以下のサンプルアプリは Go 1.24 を使ってローカルでビルド・実行でき、ビルドプランは、Lizard が使う lizardpack で確認しました。このガイドのデプロイ手順は、まだ最初から最後まで試していません。
始める前に
- デプロイするディレクトリに
go.modがあり、依存関係がある場合はgo.sumもある Go モジュール。 lizard loginでサインイン済みで、Pro または 7 日間の Pro トライアル(カードが必要)を利用している Lizard CLI。料金を参照してください。
最小構成のアプリ
go.mod:
module example.com/hello
go 1.24main.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 on Lizard")
})
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "ok")
})
log.Printf("listening on :%s", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}":"+port はすべてのインターフェースで待ち受けます。127.0.0.1:8080 のようなアドレスではコンテナ内からの接続しか受け付けず、デプロイはいつまでも healthy になりません。
ローカルで確認します:
go run .
curl http://localhost:8080/healthzlizardpack がビルドするもの
| ステップ | 内容 |
|---|---|
| 検出 | go.mod、go.work、または任意の .go ファイル。lizardpack は Node.js や Python より先に Go を確認します。 |
| Go のバージョン | go.mod の go 行。使われるのはメジャーとマイナーだけで、go 1.24.3 は golang:1.24-alpine 上でビルドされます。go.mod がない場合は Go 1.24。 |
| ビルド | go mod download の後に CGO_ENABLED=0 GOOS=linux go build -ldflags='-s -w' -o /app/server <package> |
| main パッケージ | ルートディレクトリ。cmd/main.go がある場合は ./cmd。それ以外は、アルファベット順で最初の cmd/<name>/main.go |
| ランタイム | ca-certificates と tzdata を含む alpine:3.19。lizardpack はソースディレクトリ全体をバイナリと並べて /app にコピーするため、templates/ や static/ などの相対パスもそのまま使えます。 |
| 起動とポート | ポート 8080 で /app/server |
生成される Dockerfile:
FROM golang:1.24-alpine AS build
WORKDIR /app
COPY go.mod go.sum* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-s -w' -o /app/server .
FROM alpine:3.19
RUN apk add --no-cache ca-certificates tzdata
WORKDIR /app
COPY --from=build /app /app
EXPOSE 8080
CMD ["/app/server"]このイメージを使うには、サービスのビルドコマンドと起動コマンドを空のままにしてください。どちらかが設定されていると、Lizard はそのコマンドから別の Dockerfile を生成し、go 行を無視します。その場合、go build … コマンドは Go 1.24 でビルドされます。すべてのステップを自分で制御するには、独自の Dockerfile をコミットしてください。Dockerfile から Docker コンテナをデプロイするを参照してください。
デプロイ
モジュールのルートから実行します:
lizard init --name go-app
lizard add --service api
lizard up --service api --port 8080lizard up はディレクトリをアップロードし、Lizard のビルドマシンでビルドして URL を表示します。コマンドを実行するマシンに Docker や Go は必要ありません。git push to deploy を使う場合は、lizard add -r your-org/your-app -n api で GitHub リポジトリを接続 し、lizard port --service api が 8080 を表示することを確認してください。
フレームワーク
- net/http、chi、gorilla/mux: 上の例のように、
http.ListenAndServeに":" + os.Getenv("PORT")を渡します。 - Gin: アドレスなしの
r.Run()はPORTを読み取り、なければ:8080を使います。サービスにGIN_MODE=releaseを設定してください。 - Echo、Fiber: アドレスを自分で渡します。
e.Start(":" + os.Getenv("PORT"))またはapp.Listen(":" + os.Getenv("PORT"))を使ってください。
変数とデータベース
サービスに設定を追加し、os.Getenv で読み取ります:
lizard secrets set GIN_MODE=release API_KEY=change-me --service apiデータベースには Managed Postgres を追加し、参照 を使ってそのプライベート URL を渡します:
lizard add postgres
lizard secrets set DATABASE_URL='${{postgres.DATABASE_PRIVATE_URL}}' --service apiその後、pgxpool.New(ctx, os.Getenv("DATABASE_URL")) のようにドライバーで接続します。変数を変更すると、再ビルドなしでサービスが再起動します。
動作を確認する
lizard logs --build --service api
lizard logs --service api --tail 100
lizard pslizard up が表示した URL で /healthz をリクエストし、続いて実際の処理を行うルートをリクエストします。ビルドログには、ビルドに使われた golang: イメージが表示されます。
よくある問題
| 症状 | 対処 |
|---|---|
no Go files in /app | main パッケージがルートにも cmd/ の下にもありません。移動するか、Dockerfile を追加します。 |
| 違うバイナリが起動する | cmd/<name>/main.go が複数ある場合、lizardpack はアルファベット順で最初の名前をビルドします。目的のバイナリをビルドする Dockerfile を追加してください。 |
CGO_ENABLED=0 で SQLite が失敗する | ビルドで cgo が無効になるため、mattn/go-sqlite3 は動作しません。pure Go のドライバーを使うか、できれば Managed Postgres を使ってください。コンテナ内のファイルはデプロイのたびに失われます。 |
| デプロイがいつまでも healthy にならない | プロセスは PORT(または 8080)で、すべてのインターフェースに対して待ち受ける必要があります。サービスが healthy にならないを参照してください。 |
| より新しい Go が必要 | go mod edit -go=1.25 などで go 行を変更し、もう一度デプロイします。ランタイムバージョンを参照してください。 |
キューコンシューマーのように HTTP を提供しない Go プロセスは、--port 0 を付けて バックグラウンドワーカー として実行します。
関連項目
更新日