Skip to content

Instantly share code, notes, and snippets.

@mapk0y
Last active June 25, 2020 02:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mapk0y/f029595092f375841dfafb021728427a to your computer and use it in GitHub Desktop.
Save mapk0y/f029595092f375841dfafb021728427a to your computer and use it in GitHub Desktop.
mysql コンテナと sql ファイル

ホスト側/コンテナ側にある sql ファイルを食べさせる方法

準備

  1. mysql5.6 の docker 公式イメージでコンテナを起動済み(コンテナ名 mysql56
  2. ホストのカレントディレクトリに select 'host'; と書かれた select.sql を配置。
  3. コンテナ内の 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.

理由

sh -c を付けない場合

ホスト側の shell が docker exec -i mysql56 mysql -prootpass< select.sql を別々に解釈して、ホスト側の select.sql を展開した後に docker exec の stdin にそれを食べさせる。 docker exec はそのままでは stdin は無視するので -i オプションを追加。

sh -c を付ける場合

ホスト側は特に何もせずコンテナ内で sh が mysql -prootpass < select.sql を実行する。 コンテナ内で実行されてるので WORKDIR(デフォルトでは /)の select.sql がコンテナ内で mysql コマンドに渡される。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment