開発用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から初期データ作成等できますね(`・ω・´)
実際に呼び出されるタイミングは、
で、この、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で実装する形になりますが、同じように初期化処理が実現できるようです。