ibmcom/db2のcontainer構築~ddl実行/データimportまでをbatファイルで自動化した


概要

db2(旧dashdb)のcontainerを構築してddlを実行し、データをimportするようなbatファイルを作ろうとしたところ、主にユーザー切り替え周りでつまづいたのでメモ

やりたいこと

以下を自動化したい!
1. dockerhubのibmcom/db2のcontainerを構築
2. 以下のようなddlを実行

ddl.sql
 CREATE TABLE
    TBL_A ( 
    HOGE VARCHAR(50) NOT NULL,
    FUGA VARCHAR(50) NOT NULL UNIQUE );

3. 以下のようなcsvファイルをimport

import.csv
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