ローカルで動いたから本番でも動くと思っていました。
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: を明示します。
これらは全部「ローカルでは出ない問題」です。本番に近いステージング環境で一度通してみることが結局の近道でした。