LoginSignup
28
17

More than 5 years have passed since last update.

Flyway + PostgreSQLのDBマイグレーション環境をDockerを使って構築する

Posted at

概要

Dockerを使ってDBマイグレーション環境をローカル環境に構築する方法を紹介します。

Flywayでのマイグレーションと言えばgradleやsbtなどのプラグインを使うのが一般的?かと思いますが、Command-Lineで実行するやり方もあります。
https://flywaydb.org/getstarted/

そして、ツールが内包された公式のDockerImageがあったのでこれを使ってローカルでマイグレーション環境を構築してみます。
https://hub.docker.com/r/boxfuse/flyway/

やりたいこと

  • DockerコンテナでPostgreSQLを立ち上げる
  • FlywayのDockerコンテナからPostgreSQLに対してマイグレーションを実行する

1. 必要なファイルを作成

docker-composeの定義

複数の関連するDockerコンテナを管理する場合はdocker-composeでやるのが便利なので、yamlを書いていきます。

docker-compose.yml
version: '3.4'

x-template: &flyway-template
  image: boxfuse/flyway:latest
  volumes:
    - ./sql:/flyway/sql # マイグレーション用SQLファイルの格納先
    - ./conf:/flyway/conf # 設定ファイルの格納先
  depends_on:
    - db

services:
  flyway-clean:
    <<: *flyway-template
    command: clean

  flyway-migrate:
    <<: *flyway-template
    command: migrate

  flyway-info:
    <<: *flyway-template
    command: info

  db:
    image: postgres:latest
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    ports:
      - 5432:5432
    volumes:
      - ./init:/docker-entrypoint-initdb.d # Create DataBase するinit用のSQLの格納先
    container_name: db

flyway.conf ファイル定義

docker-composeで定義したDBの接続先情報などを指定します。
https://flywaydb.org/documentation/configfiles

flyway.conf
flyway.url=jdbc:postgresql://db:5432/test_db
flyway.user=user
flyway.password=pass

※Composeはアプリケーションに対してネットワークを1つ設定します。
各コンテナ上のサービスはデフォルト・ネットワークに参加したら、同一ネットワーク上の他のコンテナから接続できるようになるため、コンテナ名dbでPostgreSQLにアクセス可能になります。

初期化用SQLファイルを作成

マイグレーション対象のテーブルを作成するSQL

create_database.sql
CREATE DATABASE test_db;

マイグレーション用SQLファイルを作成

ひとまず適当に2つ用意

V0.001__create_table.sql
CREATE TABLE IF NOT EXISTS test_table(test_id int, test_name varchar(255));
V0.002__insert_table.sql
INSERT INTO test_table(test_id, test_name) VALUES (1, 'test');

ディレクトリ構成

今まで作成したファイルは最終的にこんな感じの構成で配置する。

flyway-migration
├── docker-compose.yml
├── conf
│   └── flyway.conf
├── init
│   └── create_database.sql
└── sql
    ├── V0.001__create_table.sql
    └── V0.002__insert_table.sql

2.PostgreSQLコンテナ立ち上げ

コンテナを立ち上げる

$ docker-compose up -d db

dbという名前で立ち上がっていることを確認

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
52cbb658ae0a        postgres:latest     "docker-entrypoint.s…"   46 hours ago        Up 46 hours         0.0.0.0:5432->5432/tcp   db

3.flyway マイグレーション実行

migrate 実行
用意したマイグレーション用SQLが順に実行される

$ docker-compose run --rm flyway-migrate

Starting db ... done
Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:postgresql://db:5432/test_db (PostgreSQL 10.5)
Successfully validated 2 migrations (execution time 00:00.040s)
Current version of schema "public": 0.002
Schema "public" is up to date. No migration necessary.

info 実行
マイグレーションの実行履歴が確認できる

$ docker-compose run --rm flyway-info

Starting db ... done
Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:postgresql://db:5432/test_db (PostgreSQL 10.5)
Schema version: 0.002

+-----------+---------+--------------+------+---------------------+---------+
| Category  | Version | Description  | Type | Installed On        | State   |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.001   | create table | SQL  | 2018-10-01 17:05:42 | Success |
| Versioned | 0.002   | insert table | SQL  | 2018-10-01 17:05:42 | Success |
+-----------+---------+--------------+------+---------------------+---------+

ちゃんとテーブルができていることを確認する。

$ pgcli -h localhost -U user  -p 5432

user@localhost:user> \connect test_db
You are now connected to database "test_db" as user "user"
Time: 0.018s

user@localhost:test_db> select * from test_table;
+-----------+-------------+
| test_id   | test_name   |
|-----------+-------------|
| 1         | test        |
+-----------+-------------+

できてますね!

clean 実行
マイグレーションによって作成されたテーブル等を削除したい場合はcleanを実行する

$ docker-compose run --rm flyway-clean
Starting db ... done
Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:postgresql://db:5432/test_db (PostgreSQL 10.5)
Successfully cleaned schema "public" (execution time 00:00.042s)

ソースコード

ソースコードは↓に公開してますのでよければ。
https://github.com/supimen/flyway-docker-migration

以上です。

28
17
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
28
17