概要
db2(旧dashdb)のcontainerを構築してddlを実行し、データをimportするようなbatファイルを作ろうとしたところ、主にユーザー切り替え周りでつまづいたのでメモ
やりたいこと
以下を自動化したい!
1. dockerhubのibmcom/db2のcontainerを構築
2. 以下のようなddlを実行
CREATE TABLE
TBL_A (
HOGE VARCHAR(50) NOT NULL,
FUGA VARCHAR(50) NOT NULL UNIQUE );
3. 以下のようなcsvファイルをimport
hoge1,fuga1
hoge2,fuga2
やったこと①:batファイルの中身
以下、batファイルの中身を順番に説明
configファイルの読み込み
configファイルに外出しできていた方が色々と便利なので外出し
set CONFFILE=.\batconfig.ini
if not exist %CONFFILE% (
echo ERROR: Not found %CONFFILE%
exit /b 1
)
for /f "usebackq tokens=1,* delims==" %%a in ("%CONFFILE%") do (
set %%a=%%b
)
古いcontainerがいたら削除して新規作成
docker run
のコマンドはここ(→ https://hub.docker.com/r/ibmcom/db2 )のQuickStartに書いてある。
background実行させたいので、 -it
オプションを削除して -d
オプションを追加。
docker stop db2inst1
docker rm db2inst1
docker run -d --name db2inst1 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=xxxxx ibmcom/db2
powershell sleep 60
以下ログが出るまで待機させたいので、 powershell sleep 60
で待機している。(本当は docker logs -f db2inst1
で監視すべきなのだろうが、そこまではやっていない。。。)
(*) All databases are now active.
(*) Setup has completed.
ちなみに、ここで待たずに後続の処理をすると db2: command not found
というエラーが出る。
ddl/csvファイルをコピー
ファイルをcontainerの中にコピー
docker cp .\ddl.sql db2inst1:/mnt
docker cp .\insert.csv db2inst1:/mnt
shell scriptをコピー
ddl実行用のshell scriptをcontainerにコピーして、権限を付与。
Windows環境化でshell scriptを編集していたので sed
コマンドを使って改行コードを修正。
docker cp .\doddl.sh db2inst1:/mnt
docker exec -it db2inst1 bash -c "chmod a+x /mnt/doddl.sh"
docker exec -it db2inst1 bash -c "sed -i 's/\r//' /mnt/doddl.sh"
db2start/db2stopに権限を付与(ここ大事!!)
docker exec -it db2inst1 bash -c "chown db2inst1:db2iadm1 /database/config/db2inst1/sqllib/adm/db2start"
docker exec -it db2inst1 bash -c "chown db2inst1:db2iadm1 /database/config/db2inst1/sqllib/adm/db2stop"
この処理を実施しないと以下エラーが発生してしまっていたため、db2start
db2stop
に権限を付与。
-bash: /database/config/db2inst1/sqllib/adm/db2start: Permission denied
-bash: /database/config/db2inst1/sqllib/adm/db2stop: Permission denied
shell script実行
container内でshell scriptを実行
docker exec -it db2inst1 bash -c "/mnt/ddl.sh"
やったこと②:shell scriptの中身
root権限で実施したい処理
例えば、バックアップの保存とか
#!/bin/bash
mkdir /mnt/ddl.bk
cp /mnt/ddl.sql /mnt/ddl.bk/
switch userして、処理実行
こんな感じでEOFで処理を渡す。
su - db2inst1 << EOF
set -x
db2 create db testdb
db2 connect to testdb
db2 -tvf /mnt/ddl.sql
db2 import from /mnt/import.csv of del insert into TBL_A
set +x
EOF