概要
DBコンテナとしてdockerを使用していて、コンテナ外からDBを操作するシェルスクリプトを書いたらいい感じでした。
そこでコンテナ外からdockerを操作する上で重要なコマンドとなるdocker execとdocker cpについてメモしておきます。
逆に、基本的にdocker外からはこの二つのコマンドだけでdockerに実行してほしい処理はできるかと。
その他、ポイントもメモしておきます。
docker exec
$ docker exec CONTAINER-NAME COMMAND
###例1
$ docker exec -it xxxxx /home/username/xxxx.sh
###例2
$ docker exec -u 1000 xxxx /home/username/sqllib/db2start
例2だとルートユーザーで実行できるます。
linuxデフォルトのコマンド以外は、絶対パスでコマンドを呼び出さないとうまくいきませんでしたので、それも例2のようにやるとうまくいきます。
docker cp
docker外からdocker内に
$ docker cp HOST_PATH CONTAINER-NAME:CONTAINER_PATH
docker内からdocker外に
$ docker cp CONTAINER-NAME:CONTAINER_PATH HOST_PATH
ポイント
1.実行したい処理はできるだけdocker内に記述した方が楽
後述の通り、dockerは権限周りでよく突っかかるので、決まった処理などはできるだけdocker内にシェルスクリプトとして置いておくと楽でした。
理想系は、docker外からはdocker exec
docker cp
chmod
の3つのコマンドしか使用しない状態だと思います。
2..docker内にcpするファイルはchmodを忘れずに
dockerは権限で突っかかりがちなので、docker内にコピーするファイルはchmodで適宜権限を変更してください。
3. (DBを操作する場合)sqlファイルをdocker cpにコピー& docker内に配置したシェルで実行すると楽
DBコンテナの場合は、sqlファイルはdocker内で実行することになります。sqlコマンドが固定ならdocker内にずっと格納しておけば良いですが、可変の場合はsqlファイルをdocker cpするようにしておくと楽でした。
以下実際のコマンド例です。
# sqlファイルの権限変更
chmod 755 SQL_FILE.sql
echo 'copy sql file to docker..'
# Docker にsqlファイルをコピーし、dbに反映
docker cp SQL_FILE.sql CONTAINER_NAME:home/USER_NAME
# echo 'applying sql setting to db..'
docker exec -u 1000 CONTAINER_NAME home/USER_NAME/SQL_FILE.sql > /dev/null
echo 'completed'
4. docker内でディレクトリ移動してコマンドを実行するときは下記のように
$ docker exec some_container "bash -c cd DIRECTORY_PASS && command"