Bot プログラミングスキル 環境構築・インフラ 開発ログ

🛠️開発記録#224(2025/5/14)トレードロジック以外の基礎部分🪄セクション3:entrypoint.shの仕組みと起動時の魔法

―「Botが動き出す前」に必ず通るチェックポイント

前回は Dockerfile でBotの中身を作り上げる工程を見てきました。
ですが、イメージができただけではBotは動きません。

Botが本当に動き出すのは、entrypoint.shが起動してからです。

このシェルスクリプトは、Bot起動時に最初に実行される“スタートボタン”
かつ、設定ミスや危険な値がある場合は**即時にストップさせる“関所”**の役割も担っています。


📜3.1 entrypoint.sh って何?

Dockerfile の最後でこんなふうに指定されていたことを覚えていますか?

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

これはつまり:

🔽 コンテナが起動された瞬間に
🔧 /usr/local/bin/entrypoint.sh が自動で実行される

という指定です。

このスクリプト内でBotの設定展開・整合性チェック・本体起動までが一括で行われます。


🧪3.2 中で何が行われているか?(処理の全体像)

実際の処理は以下のような流れになっています。

set -eu
envsubst < config_mainnet.tpl > config_mainnet.json
jq empty config_mainnet.json
exec python -m MMbotbybit.core --mode ${MMBOT_MODE:-mainnet}

この4行だけですべての起動準備が完結しているのです。
以下、それぞれを詳しく見ていきましょう。


🔍3.3 処理ステップごとの解説

ステップ内容初心者向け解説
set -eu例外時に即終了-eはエラー即終了、-uは未定義変数で即死。事故防止の基本です。
envsubstテンプレ変数を展開.env.prod$SYMBOL などを config_mainnet.tpl に流し込み → config_mainnet.json を生成
jq emptyJSONが壊れてないか確認作られた config_mainnet.json を構文チェック。崩れてたら exit 1 で異常終了
exec python -m MMbotbybit.coreBot本体を起動Pythonモジュールとして core.py を起動。ここで初めてBotの取引ロジックが動き出す

📌3.4 なぜこの順序が重要なのか?

  • 最初に 環境変数を展開
  • 次に 構文ミスなどをチェック
  • 問題がなければ Pythonで本体起動
  • エラーがあれば 起動中止&自動再起動(Dockerのrestartポリシー)

という流れが、誤った設定でBotが暴走することを防いでいるのです。


🧭【図解】entrypoint.sh による起動処理フロー

flowchart TD
    A["コンテナ起動"] --> B["entrypoint.sh 開始"]
    B --> C["環境変数をテンプレに展開(envsubst)"]
    C --> D["JSON構文チェック(jq)"]
    D --> E{"構文OK?"}
    E -- Yes --> F["Bot本体を起動(core.py)"]
    E -- No  --> G["exit 1 → 自動再起動"]


🧠3.5 補足:なぜ "${VAR}" ではなく裸変数なのか?

MMBotでは .env.prod に書かれた数値をテンプレ内で "${MAX_NOTIONAL_USD}" のように書かず、そのまま $MAX_NOTIONAL_USD として埋め込んでいます。

これは意図的に文字列ではなく数値としてJSONに埋め込むため
→ Python 側で float() にキャストする必要がなくなるのです。


🧵まとめ:entrypoint.shはBotの“健康診断”を担当する

このスクリプトのおかげで:

  • 間違ったAPIキーや不正な数値でBotが起動しない
  • ローカルや本番で同じテンプレを使い回せる
  • Botの実行が一貫性ある「安全なスタート」を切れる

という**“堅牢な初動”**が実現できています。

-Bot, プログラミングスキル, 環境構築・インフラ, 開発ログ