Dockerfile
alpineを使うことで、軽量なdocker イメージを利用することができます。
基本的にGolangは、マルチビルドな構成のため、FROMが二つあります。
デフォルトのGOARCH=amd64
を指定してますが、余裕があればさらに軽量のGOARCH=arm64
を試してみてください。
### ビルド用ステージ ###
FROM golang:1.21.4-alpine as builder
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY . .
RUN GOOS=linux GOARCH=amd64 go build -o main .
### 開発用ステージ ###
FROM golang:1.21.4-alpine as development
# アップデートとvim,gitのインストール
RUN apk update && apk add vim git
# sqlcのインストール
RUN go install github.com/sqlc-dev/sqlc/cmd/sqlc@v1.22.0
# migrateのインストール
RUN go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
# /appに移動
WORKDIR /app
# builderからmainをコピー
COPY --from=builder /app/main .
# airのインストール
RUN go install github.com/cosmtrek/air@latest
CMD ["air"]
compose.yml
GolangからPostgreSQLへの接続に失敗しないための構成であり、リトライ処理や依存関係を意識してます。
compose.yml
version: "3.8"
services:
web:
build:
context: .
target: development
dockerfile: ./docker/golang/Dockerfile
ports:
- "8081:8080"
volumes:
- .:/app
- go_cache:/root/.cache/go-build # go buildのキャッシュを永続化
depends_on:
db:
condition: service_healthy # dbサービスが「healthy」(健全)状態になるまで起動
restart:
on-failure # サービスが失敗した場合、再起動します。
db:
image: postgres:14
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: Passw0rd
POSTGRES_DB: db
TZ: Asia/Tokyo
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"] # PostgreSQLが準備完了しているかチェック
interval: 10s # チェックのインターバル
timeout: 5s # チェックのタイムアウト
retries: 5 # リトライの回数
start_period: 10s # コンテナ起動後、ヘルスチェックを開始するまでの時間
volumes:
go_cache:
db_data:
実行コマンド
go
go mod init golang_docker
go mod tidy
docker compose
docker compose build
docker compose up -d
マイグレーション(migrateコマンド)
docker compose run --rm web migrate -path /app/db/migration create -ext sql -dir db/migrations -seq users
docker compose run --rm web migrate -path /app/db/migration -database "postgres://postgres:Passw0rd@db:5432/db?sslmode=disable" up
docker compose run --rm web migrate -path /app/db/migration -database "postgres://postgres:Passw0rd@db:5432/db?sslmode=disable" down
クエリファイル生成(sqlcコマンド)
docker compose run --rm web sqlc generate
PostgreSQL
# 接続
docker compose exec db psql -U postgres -d db
\dt
\d users