dockerで色んな環境を構築してきたけど、やはりdb2絡みが一番めんどい。
何が大変って、DB2のビルドが3~5分かかること。
ヘルスチェックでビルド終わるまで待たせているんだけど、DB2のビルドが終わったら自動でSQLでテーブルを作成したいんだけど
DB2のビルド時間かかりすぎて、上手くいかなかった
悩む事2日・・・・
ちなみにAIにも相談してみて、いいヒントももらえた
AIは情報収集なら使える
試行錯誤した結果解決出来ました。
●dockerでDB2のビルドが終わってから処理させる方法
まず「docker-compose.yml」で
environment:
- LICENSE=accept
- DB2INSTANCE=db2inst1
- DB2INST1_PASSWORD=password
- DBNAME=RBWEB2
- ORIG_ENTRYPOINT=/var/db2_setup/lib/setup_db2_instance.sh
「ORIG_ENTRYPOINT」を「setup_db2_instance.sh」に設定する事でDB2のビルドが終わった後に「setup_db2_instance.sh」が実行されるようになります。
次に
entrypoint: ["/bin/bash", "/usr/local/src/shared/script/db2-wrapper.sh"]
を指定、これはどこに置いてもいいけど、DB2がビルドされた後に「db2-wrapper.sh」が実行されるようになります。
「db2-wrapper.sh」の中身は以下のようになります。
#!/bin/bash
set -euo pipefail
# DB2本来の起動処理を先に動かす
“$ORIG_ENTRYPOINT” “$@” &
MAIN_PID=$!
trap ‘kill -TERM “$MAIN_PID” 2>/dev/null || true; wait “$MAIN_PID”; exit 143’ TERM INT
# db2inst1 作成待ち
for i in {1..180}; do
if id -u db2inst1 >/dev/null 2>&1; then
break
fi
sleep 2
done
# DB接続可能待ち
for i in {1..180}; do
if su – db2inst1 -c “db2 connect to ${DBNAME} >/dev/null 2>&1 && db2 terminate >/dev/null 2>&1”; then
break
fi
sleep 2
done
# 初回のみ初期化
if [ ! -f “$INIT_DONE_FILE” ]; then
chown -R db2inst1:db2iadm1 /database || true
su – db2inst1 -c “sh 実行したいSHファイルのパス”
touch “$INIT_DONE_FILE”
fi
wait “$MAIN_PID”
これで、DB2のビルドが終わった後に「db2-wrapper.sh」が実行されるようになります!!!
わーい

コメント