質問: 状況 --- `docker-compose build`時にMySQLを起動し、dump.sqlのようなデータベースのデータを全てインポートしております。 MySQLはどこかのサーバーに繋いでいるわけではなく、コンテナ内に立てて、それぞれのローカルで動かすイメージです。 問題点 ---- アプリケーション開発をする上での問題点なのですが、 もし、データベースの構成がALTER TABLE等で変わった場合、 ソースコードはデータベースの構成が変更された状態になっているのですが、 dump.sqlの構成は更新されていないので、 変えた本人以外はアプリケーションを立ち上げた時にエラーになってしまいます。 そうなると、都度、dump.sqlを編集するという作業が必要になってくるという問題が発生します。 上記の問題を回避すべき方法は以下の通りだと考えています。 * ローカルではなく、別にデータベースサーバーを立てて、そこに接続するようにする(このサーバーの管理が必要) * `docker-compose build`をしたときに、ステージング環境等からdumpしてきて、そのdump.sqlを利用する(時間がかかる & ローカルで登録等したデータが消えてしまう) * ALTER TABLE等でデータベースの構造が変わる際、dump.sqlと同階層に保存し、`docker-compose build`時にdump.sqlと同様に構築できるようにする(ルール化) 皆様はどのような方法が良いと思いますか? 上記であげた方法、それ以外にもうちではこのようにしている等ございましたらご教授いただけると幸いです。 よろしくお願い致します。
回答: 使用しているアプリケーションのフレームワークでマイグレーションとシーダーを使ってください。例えば PHP + Laravel の開発では ``` increments('id'); $table->string('name'); $table->string('airline'); $table->timestamps(); }); } /** * マイグレーションを元に戻す * * @return void */ public function down() { Schema::drop('flights'); } } ``` のようなマイグレーションファイル,および ``` insert([ 'name' => str_random(10), 'email' => str_random(10).'@gmail.com', 'password' => bcrypt('secret'), ]); } } ``` のような,開発用のダミーデータを投入するシーダーファイルを必要なぶんだけ作り, ``` ./artisan migrate:fresh --seed ``` を実行してますね。このコマンドを実行すると * データベースの全テーブルの削除+再作成 * テーブルへのデータ投入 がその都度行われます。 開発環境ではこのようにテーブル群をゼロから構築し,データをその都度再投入すればよいです。**またリリース前段階の開発では,作成済みのマイグレーションファイルを編集してコミットしても構いません。** **逆にリリース後には,それまで作成したマイグレーションファイルには一切触れてはいけません。**変更が必要な場合,新しいマイグレーションファイルに`ALTER TABLE`を書きます。必要に応じてデータの挿入処理を書いたりもします。