ホスト側/コンテナ側にある sql ファイルを食べさせる方法
- mysql5.6 の docker 公式イメージでコンテナを起動済み(コンテナ名 mysql56 )
- ホストのカレントディレクトリに
select 'host';
と書かれた select.sql を配置。 - コンテナ内の WORKDIR(デフォルトでは /)に
select 'container';
と書かれた select.sql を配置
$ # 配置しているファイルの確認(ホスト側)
$ cat select.sql
select 'host';
$ # 配置しているファイルの確認(コンテナ側)
$ docker exec mysql56 cat select.sql
select 'container';
$ # docker exec でそのまま select .sql を食べさせる(ホスト側ファイルが利用される)
$ docker exec -i mysql56 mysql -prootpass < select.sql
Warning: Using a password on the command line interface can be insecure.
host
host
$ # docker exec で `sh -c` を通して select.sql を食べさせる(コンテナ側ファイルが利用される)
$ docker exec -i mysql56 sh -c 'mysql -prootpass < select.sql'
container
container
Warning: Using a password on the command line interface can be insecure.
ホスト側の shell が docker exec -i mysql56 mysql -prootpass
と < select.sql
を別々に解釈して、ホスト側の select.sql を展開した後に docker exec
の stdin にそれを食べさせる。
docker exec
はそのままでは stdin は無視するので -i
オプションを追加。
ホスト側は特に何もせずコンテナ内で sh が mysql -prootpass < select.sql
を実行する。
コンテナ内で実行されてるので WORKDIR(デフォルトでは /)の select.sql がコンテナ内で mysql コマンドに渡される。