Docker Toolbox とは
Windows環境でDockerを使用する場合、
- Windows 10 Pro あるいは Enterprise -> Docker for Windows
- Windows 10 Home(Docker for Windowsのシステム要件を満たしていないもの)-> Docker Toolbox
と使い分ける必要があります。
本記事は、後者のDocker Toolbox利用者向けの内容になります。
docker-compose.xmlのvolumes定義でマウント
Docker for WindowsやDocker for Macの場合は、docker-compose.xmlのvolumesに下記のように記述すると、
ホストのディレクトリをコンテナのディレクトリにマウントすることができます。(ホストのディレクトリ:コンテナのディレクトリ
)。
version: '3'
services:
db:
~中略~
environment:
~中略~
volumes:
- ./initdb:/docker-entrypoint-initdb.d
- ./data:/var/lib/data
特に、コンテナ側に/docker-entrypoint-initdb.dを指定すると、
ホスト側に格納していおいた.sqlや.iniをコンテナの初回起動時に実行してくれるため、
DB作成直後のテーブル作成やレコード作成に活用することが多いですね。
Docker for WindowsやDocker for Macでは、この記述で期待通りマウントが行われますが、
Docker Toolboxでは、期待通りマウントが行われません。
例えば、/docker-entrypoint-initdb.d宛に初回起動時に実行されてほしいsqlのフォルダを指定しても、
コンテナの初回起動時のログに下記のように出力され、sql実行がignoringされてしまいます。
正しくマウントが行われていれば、コンテナの/docker-entrypoint-initdb.dディレクトリにsqlなどがコピー・実行されますが、
マウントに失敗するため、/docker-entrypoint-initdb.d配下にファイルが無く、何も実行されないのです。
マウントするための対策
原因は、Docker Toolboxでは、マウントできるホスト側のフォルダが限られているためです。
docker-compose.xmlでそのフォルダを指定する必要があります。
Docker Toolboxをインストールした際、VirtialBoxもインストールされたと思います。
VirtialBoxで、Default>右クリック>設定>共有フォルダーで、下記の設定が確認できます。
この「c/Users
」が、マウントできるホストのフォルダです。
なので、docker-compose.xmlを下記のように書き換え、
volumes:
- /c/Users/initdb:/docker-entrypoint-initdb.d
コンテナの再起動を行います。
(必要に応じて、コンテナの削除→起動を行ってください。)
すると、コンテナ起動時のログに、下記のように出力され、sqlが実行されたことが確認できます。
もちろん、コンテナに入ってもDBに入っても、期待通りマウントとsql実行が行われていることが確認できます。
最後に
解決のために、いろいろな記事を参考にさせて頂きました。ありがとうございました。