結論
Windows上でdocoker-machineを使ってmysqlのデータ領域をローカルにバックアップするときは、トップレベルに定義したvolumesを使わないといけない(ただし無理やり回避することは可能)。
※docker for Mac の場合は問題なし
ダメな例
version: "3"
services:
db:
image: mysql:latest
volumes:
- ./.data/db:/var/lib/mysql
- ./db-data/mysql.dump.sql:/docker-entrypoint-initdb.d/install_wordpress.sql
・・・
OKな例
version: "3"
services:
db:
image: mysql:latest
volumes:
- db-data:/var/lib/mysql
- ./db-data/mysql.dump.sql:/docker-entrypoint-initdb.d/install_wordpress.sql
・・・
volumes:
db-data:
問題
以下の記事を参考にdockerでwordpress開発環境の構築をしました。
docker-compose を使って WordPress テーマ開発環境を構築しよう – PSYENCE:MEDIA
上記の記事ではトップレベルのvolumes内で定義したvolumesを使う方法が紹介されていました
Docker の Data Volume まわりを整理する
この方法だと、ローカルの中で永続化されているのでdokcer-compose down -v
などでvolumeごと削除すると永続化したデータが消えます。
なので、更新するごとにdocker exec -it dbコンテナ名 sh -c 'mysqldump データベース名 -u データベースユーザ名 -pデータベースパスワード 2> /dev/null' > db-data/mysql.dump.sql
として、データを保存しないといけません。
手元にデータを置いておきたかったのでトップレベルのvolumesを使わずに、ホスト側のディレクトリに保存することに。
公式のやり方もこっちだったので以下を参考に。
クイックスタート・ガイド:Docker Compose と Wordpress — Docker-docs-ja 17.06.Beta ドキュメント
しかし、このやり方だとWindowsでdocker-toolboxを使っている場合(Windowsは大体そうだと思いますが)上手くいきません。
(なお、手元のdocker for macでは上手く動きました)
以下の記事に詳しくまとまっています。無理やり回避する方法も載っているので、どうしてもhost側に置きたい場合はどうぞ。
docker composeでMySQLのデータ領域をローカルにマウントする | WEB EGG
まとめ
volumesトップレベル定義 | host側のディレクトリにマウント(通常の方法) | |
---|---|---|
Windows docker-toolbox | 〇 | × |
docker fot mac | 〇 | 〇 |