0
0

More than 3 years have passed since last update.

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

Posted at

概要

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0