9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laradockのmysqlで初期起動時に複数DBを作成する(ハマった)

Last updated at Posted at 2018-08-09

背景

普段Laradockで色々遊んだりすることもあるんですが、
ユニットテスト用のDBをコンテナ初期起動時に用意しよう、と思って
やったことのメモ。

また、設定できたLaradockを別のデバイスで立ち上げると
mysqlが上のDBを作成せずにハマったのでその共有

前提条件

Laradockをgitのsubmoduleで取得している

.ginmodule
[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が初回起動時に作成される

createdb.sql
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は上記ディレクトリを起動時にローカルのディレクトリでマウントしているんですね。

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

つまりマウントするディレクトリを消してやればよい。

.env
### 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のアップデートには基本耐えれないが、アップデートしたい時に調整すれば良いだけなので問題はないっす

9
10
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
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?