1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker/コンテナ仮想環境Advent Calendar 2024

Day 22

レビュー時にDBのDockerコンテナを切り替える

Last updated at Posted at 2024-12-22

はじめに

コードレビューをする時に、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が作られます。

docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    volumes:
      - ./local/my.cnf:/usr/etc/my.cnf
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root

ダメな例

以下のように名前付きvolumeを使うとダメです。別のコンテナで同じデータが使われます。

docker-compose.yml
  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ではやってる人はいないかもしれませんが、以下のようにローカルのディレクトリをマウントする(バインドマウント)のもダメです。

docker-compose.yml
  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

補足

匿名ボリュームの公式の説明はこちらです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?