LoginSignup
1
0

Golang&PostgreSQL:「Dockerfile」「compose.yml」環境構築

Last updated at Posted at 2024-01-21

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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0