はじめに
コードレビューをする時に、PCのローカル環境でそのコードの動作の確認を行うことがあります。しかし、もしDBのスキーマに変更が入っていたら、動作確認をするためにはそのマイグレーションを適用しないといけません。もしかしたらその変更には、カラムやテーブルのDROPのような不可逆な変更が含まれているかもしれません。自分が開発でも使っているローカルのDBのデータに、レビューのための変更を加えたくはないけど、動作確認はしたい。そんな需要を満たす方法を紹介します。
前提
- ローカル環境にMySQLのdockerを利用している
- MySQL以外でもvolumeのあるコンテナだったらいける気はしているが、動作未検証
- docker composeを利用する
方法
dockerが提供するCOMPOSE_PROJECT_NAME
という環境変数を利用します。この変数名(プロジェクト名)を変えると、コンテナ名をデフォルトのものから変更することができます。
たとえば、もともとはmyapp-mysql-1
というコンテナ名だったのが、COMPOSE_PROJECT_NAME=my2ndapp docker compose up
とすることで、my2ndapp-mysql-1
という名前のコンテナとして起動することが可能です。名前が変わるということは、そのmy2ndapp-mysql-1
は、元のmyapp-mysql-1
とは別物として認識されるということです。つまり、レビュー時にコンテナ名を変更して起動することで、別のコンテナ、別のDBを使うことができるということです。
注意点
重要なのは、匿名volumeを使う必要があることです。
もし名前付きvolumeを使っていたり、ローカルの特定のディレクトリをmysqlの/var/lib/mysql
にマウントしていたりすると、コンテナ名を変更してもデータを共有してしまうので、別コンテナで別データを持たせることができません。
以下のような状態であれば問題ありません。この状態だと、匿名volumeが自動でマウントされます。匿名volumeは異なるコンテナ名でコンテナを生成したら、自動的に別のvolumeが作られます。
services:
mysql:
image: mysql:8.0
volumes:
- ./local/my.cnf:/usr/etc/my.cnf
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
ダメな例
以下のように名前付きvolumeを使うとダメです。別のコンテナで同じデータが使われます。
services:
mysql:
image: mysql:8.0
volumes:
- ./local/my.cnf:/usr/etc/my.cnf
+ - db-store:/var/lib/mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
+ volumes:
+ db-store:
MySQLではやってる人はいないかもしれませんが、以下のようにローカルのディレクトリをマウントする(バインドマウント)のもダメです。
services:
mysql:
image: mysql:8.0
volumes:
- ./local/my.cnf:/usr/etc/my.cnf
+ - ./local/data:/var/lib/mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
補足
匿名ボリュームの公式の説明はこちらです。