Edited at

docker execとdocker cpを使ってdockerを動かすシェルスクリプトを書いた時の話

More than 1 year has passed since last update.


概要

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するようにしておくと楽でした。

以下実際のコマンド例です。


docker_sql_sample.sh


# 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"