無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

開発用DockerでのDBの初期設定について考える

最近、本腰入れて個人開発はじめました。 ちょっと今のブログが使い勝手よくないんで、CMS付きのブログサービスを作ろうかと(`・ω・´)

さて、今の時代開発環境を構築するにはDockerという便利なものがあります。 諸々の初期設定が出来合いで用意されているので、開発着手までが以前より素早く行えるようになります。いい時代ですね。


さて、今回はCMS付きブログサービスをつくるのでDBは必須です。まあMysqlになりますかね。 もし需要あってサービスインする場合でも、即AWSAuroraに載せられるので楽に運用できますし。

さて、それでは開発を、といったところですが、Database作ったり、アクセスユーザー用のGrant発行したりといった細かな作業する必要あるんですよね(´・ω・`) 今回はDockerつかってScrap&Buildが繰り返されるので、毎回この作業するの面倒です。

mysqlに関して言えば、公式イメージを使うことで、コンテナ側の/docker-entrypoint-initdb.d以下ファイルを読み込んで、初期設定できる機能があります。

https://hub.docker.com/_/mysql/

この説明の中に、Initializing a fresh instanceの項がありますが、そこに

When a container is started for the first time

とあり、containerの最初の起動時に一度だけ呼ばれるようです。実行できるのは

で、これを用いればDB作ってユーザー権限付与して、SQL dumpから初期データ作成等できますね(`・ω・´)

実際に呼び出されるタイミングは、

mysql/docker-entrypoint.sh at 696fc899126ae00771b5d87bdadae836e704ae7d · docker-library/mysql · GitHub

で、この、docker-entrypoint.shはDockerfileの

mysql/Dockerfile at 696fc899126ae00771b5d87bdadae836e704ae7d · docker-library/mysql · GitHub

で呼ばれています。つまり、イメージをビルドしたタイミングで呼んでくれるので、containerの最初の起動時に一度だけの動きをしてくれるみたいですね。良く出来てて、とてもいい(`・ω・´)



実はMongoDBも使おうと思って調べてたんですが、こちらにも同じような仕組みがあって、

https://hub.docker.com/_/mongo/

This variable allows you to specify the name of a database to be used for creation scripts in /docker-entrypoint-initdb.d/*.js (see Initializing a fresh instance below). MongoDB is fundamentally designed for "create on first use", so if you do not insert data with your JavaScript files, then no database is created.

こちらはjsで実装する形になりますが、同じように初期化処理が実現できるようです。