https://github.com/rubenv/sql-migrate を試してみた。
通常のアプリを起動する docker-compose.yml
とは別に docker-compose.migration.yml
を用意した。
version: '3'
services:
db:
build:
context: ./docker/database
restart: always
environment:
MYSQL_DATABASE: app
MYSQL_USER: user
MYSQL_PASSWORD: pass
MYSQL_ROOT_PASSWORD: pass
ports:
- 3306:3306
volumes:
- ./docker/database/mysql:/var/lib/mysql
migration:
build:
context: ./docker/migration
volumes:
- ./migrations:/work
depends_on:
- db
migration 用の Dockerfile はこんな感じ。
FROM golang:1.17.3
WORKDIR /work
RUN go get -v github.com/rubenv/sql-migrate/...
migration コンテナにマウントしてる ./migrations
にはマイグレーション用の SQL と dbconfig.yml
を置いている。
dbconfig.yml
では接続する DB の設定を書いておく。
development:
dialect: mysql
datasource: user:pass@tcp(db:3306)/app?parseTime=true
dir: .
また sql ファイルには -- +migrate Up
と -- +migrate Down
の記述が必要。
-- +migrate Up
CREATE TABLE topics (
id varchar(255),
title varchar(255),
detail varchar(255)
);
-- +migrate Down
DROP TABLE IF EXISTS topics;
$ docker-compose -f docker-compose.migration.yml run migration bash
$ sql-migrate up