―「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 empty | JSONが壊れてないか確認 | 作られた config_mainnet.json を構文チェック。崩れてたら exit 1 で異常終了 |
exec python -m MMbotbybit.core | Bot本体を起動 | 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の実行が一貫性ある「安全なスタート」を切れる
という**“堅牢な初動”**が実現できています。