このプロジェクトについて
EDINET(有価証券報告書等)の開示データをもとに、日本株の財務指標・投資判断スコアを日次で算出・公開しているサービスです。
公開サイトはこちら →
https://stocks.happy-life-design.net
前回の記事はこちら →
https://qiita.com/rightcross-ae86/items/9cdd8c3f58ca61f25270
今回やったこと
so what: 「原因不明」のまま保留していた事象を、最初の推測を疑って調べ直したら外部要因だった話です
特定のサービス1つだけを再起動するつもりが、依存関係を通じて関係ないサービスまで巻き添えで再作成される事象が発生しました。最初はよくある設定ミスだろうと推測して保留していましたが、改めて調べ直すとその推測は外れており、真因はOSが自動更新で入れ替えていた依存パッケージのバージョンアップでした。
前提: 特定サービスの再起動のはずが、関係ないサービスまで再作成された
設定変更を反映するためにdocker compose up -d airflow-webserverを実行したところ、depends_onで繋がっているだけのpostgres・redisまで意図せず再作成されました。データはbind mount実体のため失われてはいませんでしたが、なぜ指定していないサービスまで再作成されるのかがその場ではわかりませんでした。
最初の推測: 「過去の設定差分が反映されずに残っていたのでは」
その場では「以前のセッションでdocker-compose.ymlを変更した際の差分が、どこかのサービスに反映されないまま残っていたのだろう」と推測し、原因未特定のまま保留しました。
調べ直すと、推測は外れていた
後日、ターミナルログとgit履歴を改めて精査したところ、該当サービスは以前のセッション時点で既に正しい設定で再作成済みだったことが判明しました。つまり「設定差分が残っていた」という最初の推測は誤りで、docker-compose.yml側には問題がありませんでした。
真因: OS自動更新によるdocker-compose-pluginのアップグレード
/var/log/dpkg.logを確認したところ、事象発生と同日の朝(2026-08-09 06:27 JST)にOSの自動更新でdocker-compose-pluginが5.3.1→5.4.0へアップグレードされていたことが判明しました。
Compose v5.4.0のリリースノートによると、このバージョンでreconcile(実際のコンテナと設定ファイルが一致しているかどうかの判定)処理が変更され、volume/networkのハッシュ追跡が新規導入されています。この結果、5.3.1時代に作成されたコンテナが持つconfig-hashラベルが5.4.0の新しい計算方法と一致しなくなり、設定内容は無変更でもdocker compose up -d <特定サービス>実行時に、depends_onで繋がる無関係なサービスまで「Recreate」と誤判定されるようになっていました。
Compose開発元もIssue #10907で「config-hashの計算はコマンド種別によって内部変換が微妙に異なり、本来一致すべきハッシュが食い違うことがある」既知の課題として認めています。
対応: 影響範囲を洗い出して計画的に同期
docker compose up -d --dry-run(模擬実行・実際には変更しないオプション)で確認したところ、既に発覚していたpostgres/redis/airflow-webserverに加えてqdrant/streamlit/api/airflow_scheduler/airflow_worker/airflow_initの6サービスにも同じズレが残っていることが判明し、計9サービスに影響が及んでいました。データはbind mount実体のため再作成しても失われないことを確認したうえで、docker compose up -dで全サービスを計画的に同期しました(各数十秒の瞬断あり・データ影響なし)。
再発防止
以下の運用ルールをCLAUDE.md・設計書に明記しました。
- OS/Docker関連のシステム更新があった後
- docker-compose.ymlを編集して特定サービスだけ
up -dする前
いずれの場面でも、実行前にdocker compose up -d --dry-runで影響範囲を確認してから進めることをルール化しています。
まとめ
「原因不明」のまま保留した事象について、最初の推測(設定差分の取りこぼし)を鵜呑みにせずログとgit履歴で裏付けを取り直したところ、自分の設定ミスではなく、OSが自動更新で入れ替えていた依存パッケージのバージョンアップという外部要因が真因でした。気になる点・ご質問があればコメントでお知らせください。