Bot

開発記録#205(2025/5/2)MMbot開発ログ13「Docker-MMBotが動くまでにハマった7つの落とし穴と抜け道」

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

**この記事は “自宅 PC × Docker Compose × Python‐bot” を初めて回し始めたときに私が **“ハマって → 抜け出した” トラブル集 です。
同じ所ではまった未来の自分&読者さんのために、

  • 何が起きた?(症状)
  • なぜ?(原因)
  • どう直した?(応急処置)
  • 次は迷わないコツ(再発防止)
    をまとめました。
    ※ API キーや Slack URL など “秘密情報” は すべて伏せ字 にしてあります。

1. config_mainnet.json が「フォルダ扱い」になって読めない

内容
症状コンテナ内で cat /app/config_mainnet.jsonIs a directory と怒られる
原因ホスト側に 同じ名前のディレクトリ を作ってしまい、
Docker が “ディレクトリ over ファイル” でマウントした
応急処置bash mv config_mainnet.json config_mainnet_backup_dir
→ 改めて JSON ファイルを作成
もう迷わないコマンドを習慣に:
ls -ld config_mainnet.json → 先頭が -rw ならファイル、drw ならフォルダ

2. --profile オプションが効かない

内容
症状unknown flag: --profile
原因Docker Compose v2 は
docker compose --profile live up -d順番じゃないと読んでくれない
応急処置コマンドを並び替え
もう迷わないbash alias dcu='docker compose --profile live up -d'

3. ソースを書き換えても古いコードが動く(.pyc の罠)

内容
症状直したはずのバグがコンテナ内で再現…
原因Python は先に .pyc を読む。
タイムスタンプが古いと新ファイルを無視することも
応急処置bash find . -name '*.pyc' -delete
touch *.py で更新時間を前に出す
もう迷わない開発中は環境変数 PYTHONDONTWRITEBYTECODE=1 に。
.dockerignore__pycache__/ を追加

4. from __future__ import annotations なのに SyntaxError

内容
症状「future import はファイル冒頭に置け」と怒られる
原因#!/usr/bin/env… と docstring の さらに後ろ に書いていた
応急処置docstring の直後 に移動
もう迷わないVS Code / PyCharm の Linter を有効化(位置ズレで即警告)

5. envsubst で作るはずの設定ファイルが空

内容
症状/app/config_mainnet.json が 0 byte
原因同じパスを volume マウントすると、
生成された直後にホストの空ファイルで上書き
応急処置テンプレートは /tmp/config.tpl として 読み取り専用 でマウントし、
entrypoint で /app/config_mainnet.json を生成
黄金パターン```yaml
volumes:./config.tpl:/run/config.tpl:ro
entrypoint: >
/bin/sh -c "
envsubst < /run/config.tpl > /app/config_mainnet.json &&
exec python …
"``` |

    6. Bybit エラー retCode 110007 (InsufficientAB)

    内容
    症状注文が弾かれ “証拠金不足” メッセージ
    原因MAX_NOTIONAL_USD を超えるロット/レバが低すぎ
    応急処置ロットを半分 (0.0005) にし、環境変数 DEFAULT_LEVERAGE=10 を設定
    もう迷わない注文前に “余力 API” を叩いてログ出力 → 門前払い するコードを仕込む

    7. Slack 通知が毎回 “Cancel” になる

    内容
    症状取引所では約定しているのに Slack では全部 Cancel
    原因約定チェックを Order List REST でポーリング。
    実際の Fill は Execution WebSocket で流れてくる
    応急処置現在 WS 版に書き換え中(TODO)
    もう迷わない原則:
    「口座残高が動くイベント=WebSocketで即時検知」

    迷ったら使う“5 ステップ”デバッグ

    • 1.症状の種類をラベル付け(ビルド?ランタイム?API?)
    • 2.最小再現を 1 コマンドに↓
    docker compose exec mmbot python - <<'PY'
    # 20 行以下で症状を再現
    PY
    
    • 3.ログを絞る
    docker compose logs -f mmbot | grep -E 'ERROR|retCode'
    
    • 4.ホストとコンテナの差分を疑う
    docker compose exec mmbot env | sort | head
    docker inspect mmbot-mmbot-1 --format '{{ json .Mounts }}'
    
    • 5.1 問題 = 1 コミット / 1 メモ
      Notion や Git の PR に “現象→原因→Fix” を残すと未来の自分が助かる

    そもそもトラブルを減らす仕掛け

    仕組み何が嬉しい?
    CI で docker build && pytest変な import や空 JSON をプッシュ前に検知
    .dockerignore を整理古い .pyc.env がイメージに混入しない
    Secrets Manager or .env ファイルAPI キーをシェル履歴に残さない
    Makefile / bash aliasmake up, make logs でタイプ量 1/3
    Runbook「110007 が出たら余力チェック」など 判断を手順化

    次の To Do

    1. Execution WS で約定検知 → Slack 完全同期
    2. DB に正しく保存 → PnL 計算ロジックをテスト
    3. パラメータ (lot / s_entry) チューニング
    4. GitHub Actions で CI 設定 → “壊しても怖くない” フローへ

    このサイクルを回せば、ほとんどのトラブルは 「仕組みで未然防止 or 1 コマンドで再現&修正」 できるようになります。
    それでは楽しい自動売買ライフを!🚀

    -Bot