cat posts/docker-compose-%e3%81%a7%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%9f%e3%82%89%e6%9c%ac%e7%95%aa%e3%81%a8%e6%8c%99%e5%8b%95%e3%81%8c%e9%81%95%e3%81%a3%e3%81%9f%e8%a9%b1.md

Docker で「ローカルでは動くのに本番で動かない」パターン

Docker を使っていても「ローカルでは動くのに本番で動かない」は起きます。自分がハマったパターンをメモとして残しておきます。

環境変数が読まれていなかった

開発環境では .env を docker compose が自動で読みますが、CI/CD 経由でデプロイしたときに .env が存在せず環境変数が空になっていました。エラーメッセージが出ないまま動かない状態で、原因の特定に時間がかかりました。

今は GitHub Actions の Secrets で渡して、.env ファイルに頼らない構成にしています。

ボリュームのパーミッションで詰まった

Mac(APFS)ではパーミッションが緩く、Linux の本番サーバーでは厳密なので、コンテナ内のユーザー ID とホスト側のファイルオーナーが一致していないと「Permission denied」が出ます。Dockerfile で USER を明示するか、起動スクリプトで chown するかで解決しました。

ログが出ていなかった

アプリがログをファイルに書き出していて docker logs に出ていなかったことがありました。Docker は標準出力・標準エラーを拾うので、ログ出力を stdout/stderr に向ける設定が必要です。これをやっていないと、障害時に何が起きたかわかりません。