背景
普段Laradockで色々遊んだりすることもあるんですが、
ユニットテスト用のDBをコンテナ初期起動時に用意しよう、と思って
やったことのメモ。
また、設定できたLaradockを別のデバイスで立ち上げると
mysqlが上のDBを作成せずにハマったのでその共有
前提条件
Laradockをgitのsubmoduleで取得している
[submodule "laradock"]
path = laradock
url = https://github.com/Laradock/laradock.git
書いてて思ったが、submodule取ってくるたびにこれだと最新のになっちゃう。。
追記:submoduleはコミットハッシュを記録しているので、自ら更新かけない限り、最新にはならない
mysqlで初期DBを作成する方法
詳細は、この記事とか見た方がわかりやすいです。(ありがとうございます)
docker-composeでmysql使うとき初回起動時に複数のDBを作る方法
簡単にいうと特定のディレクトリにあるsqlやらshellはmysqlのイニシャライズ時に実行されるのでそれを利用する
で、Laradockで初期DBを作成するには?
Laradockには最初から以下のようにexampleが用意されているのでそれをコピーして使うと良い。
/laradock/mysql/docker-entrypoint-initdb.d/createdb.sql.example
で、コピーしたファイルの拡張子をsqlに変更して、
以下の箇所をコメントアウトするとdev_db_1というDBが初回起動時に作成される
CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ;
GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ;
それでdocker-compose up mysql
で起動すれば作成されるはず
何にハマったか
初期DBが複数作成されない
上記設定後に何度起動してもだめ
docker-compose build --no-cache mysql
してもだめ。(でも原因になり得るのでした方が良い)
コンテナ消してもだめ、docker image消してもだめ。
お前は何を持って初期起動なのか?
これが答えでした。
どうもmysqlが初期起動だと感知するのにはコンテナ内の/var/lib/mysqlの中身が関係しているみたいです(たぶん)
で、LaraDockは上記ディレクトリを起動時にローカルのディレクトリでマウントしているんですね。
### MySQL Container #########################################
mysql:
build:
context: ./mysql
args:
- MYSQL_VERSION=${MYSQL_VERSION}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- TZ=${WORKSPACE_TIMEZONE}
volumes:
- ${DATA_SAVE_PATH}/mysql:/var/lib/mysql ←--- これが原因
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${MYSQL_PORT}:3306"
networks:
- backend
つまりマウントするディレクトリを消してやればよい。
### Data Path ###
# Choose storage path on your machine. For all storage systems.
DATA_SAVE_PATH=~/.laradock/data
これか・・・。
ちなみに最新のLaradockではDATA_PATH_HOST
という定数名になってました
結論
ローカルの~/.laradock/data/mysql
を消してやれば解決しました。
ソースコード
ここに上に書いたことができるものを置いておくのでご参考ください
https://github.com/SLEAZOIDS/laravel-on-docker
なおsubmodule以下の設定はgitで管理できないので/setting
からshellでコピーできる形で利用している
そしてこの仕組みはsubmoduleのアップデートに耐えれないので、問題あり(いつか直そう)
追記:submoduleのアップデートには基本耐えれないが、アップデートしたい時に調整すれば良いだけなので問題はないっす