はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)
この記事はマイグレーションツールAtlasをDockerコンテナ内で使用したい場合の留意点を簡潔にまとめたものになります。
Atlasに関しては以下の記事で説明しています。
Atlasの仕様
Atlasではatlas migrate diff
で現在のデータベーススキーマとの差分から新しいマイグレーションファイルを生成し、atlas migrate apply
で生成されたマイグレーションファイルをデータベースに適用します。
しかし、仕様としてatlas migrate diff
とatlas migrate apply
は別々のデータベースで実行する必要があります。
公式リファレンスにもあるように、atlas migrate diff
でマイグレーションファイルを生成する際には、マイグレーション検証用のデータベースを仕様する必要があります。
atlas migrate diff create_users \
--dir "file://migrations" \
--to "file://schema.sql" \
--dev-url "docker://mysql/8/dev" # Or: "docker://mariadb/latest/dev"
Dockerコンテナ内で使用する場合
AtlasをDockerコンテナ内で使用する場合は、以下の2通りがやり方として考えられます。
- Dockerコンテナ内でDockerを使用できるようにする
- データベースを2つ用意し、検証用と稼働用に分ける
順番に説明していきます。
Dockerコンテナ内でDockerを使用できるようにする
先ほど出てきたコマンドを見返してみます。
atlas migrate diff create_users \
--dir "file://migrations" \
--to "file://schema.sql" \
--dev-url "docker://mysql/8/dev" # Or: "docker://mariadb/latest/dev"
ここでは、docker://mysql/8/dev
というデータベースを検証用として使用しています。
しかし、Dockerコンテナ内では使用できません。(単純にDockerの動作環境が無いだけです)
そのため、Dockerfileにdocker-io
をインストールするコマンドを使うことで解決できます。
データベースを2つ用意し、検証用と稼働用に分ける
こちらはDockerコンテナにDockerをインストールしたく無い方向けとなっています。
公式で使用していたデータベースを使用するのではなく、自前でもう一つ用意します。
MySQLコンテナを作っている場合は、以下の記事のやり方で初期起動時にデータベースを1つ追加で作成する事ができます。
初期データに投入する際、以下のようなSQL分を記述することで作成できます。
CREATE DATABASE IF NOT EXISTS `検証用DBの名前`;
GRANT ALL PRIVILEGES ON `検証用DBの名前`.* TO 'DBのユーザ'@'%';
FLUSH PRIVILEGES;
これにより、Dockerコンテナ内でもAtlasが扱えるようになります。
おわりに
今回はニッチな情報をお届けしました!
コマンドによるマイグレーションの制御ではなく、コンテナ起動時に実行させたいなどの要望がある場合に上記のような方法で実現するので、もしあればやってみてください!😉
最後までご覧いただきありがとうございました!
以上、センリツでした。🤓