【docker】dockerで時間のかかるビルドの後に処理をさせたい

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」が実行されるようになります!!!

わーい

コメント