cat posts/docker-compose-%e3%81%a7%e6%9c%ac%e7%95%aa%e7%92%b0%e5%a2%83%e3%82%92%e6%95%b4%e3%81%88%e3%82%8b%e3%81%be%e3%81%a7%e3%81%ab%e8%b8%8f%e3%82%93%e3%81%a0%e5%9c%b0%e9%9b%b7.md

Docker Compose で本番環境を整えるまでに踏んだ地雷

ローカルで動いたから本番でも動くと思っていました。

Docker Compose でローカル開発環境を作るのは比較的簡単です。問題は本番で同じ構成を使おうとした時に出てきます。踏んだ地雷をまとめます。

環境変数の扱い

.env ファイルをそのまま本番に置いていました。.gitignore には入れていましたが、サーバーへの配布手順が口頭伝達でした。後任が環境変数なしでデプロイして本番が壊れました。シークレット管理は仕組みで解決する必要があります。

ヘルスチェックの不在

depends_on はコンテナの起動順を制御しますが、DB が「起動している」だけでは「接続できる」ことを保証しません。アプリが DB に接続しようとした瞬間に DB がまだ初期化中で落ちていました。

db:
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
    interval: 10s
    retries: 5

app:
  depends_on:
    db:
      condition: service_healthy  # これが重要

ボリュームのパーミッション

ホストの UID と コンテナの UID がずれてファイルが書けない問題が起きました。開発時は root で動かしていたのが原因でした。本番では適切なユーザーを指定するか、user: を明示します。

これらは全部「ローカルでは出ない問題」です。本番に近いステージング環境で一度通してみることが結局の近道でした。