Docker の .dockerignore と .gitignore の設定
Docker プロジェクトの .gitignore と .dockerignore の設定方法。Docker ビルドコンテキストの最適化、マルチステージビルド、Compose のローカルオーバーライドを解説します。
詳細な説明
Docker プロジェクトには 2つの無視ファイルが必要です:バージョン管理用の .gitignore とビルドコンテキスト用の .dockerignore。目的は異なりますが、内容は大きく重なることが多いです。
Docker 固有の .gitignore パターン:
docker-compose.override.yml
.docker/
*.tar
*.gz
docker-compose.override.yml— Docker Compose のローカルオーバーライド(例:ソースコードのマウント、デバッグポートの公開)。各開発者が異なるオーバーライドを持つ場合があります。ベースのdocker-compose.ymlはコミットします。- コンテナデータボリューム — ローカル開発でボリュームとしてマウントされるディレクトリ(例:
postgres-data/、redis-data/)。 .docker/— チームによってはここにローカル Docker 設定を保存します。
.dockerignore ファイル(ビルドコンテキスト):
docker build を実行すると、Docker はビルドコンテキスト(カレントディレクトリ)全体をデーモンに送信します。.dockerignore がないと、node_modules/、.git/、テストファイルが含まれ、ビルドが遅くなりイメージが肥大化します。
必須の .dockerignore パターン:
.git
node_modules
npm-debug.log
.env*
Dockerfile
docker-compose*.yml
.dockerignore
README.md
.github
coverage
.vscode
.idea
.gitignore との主な違い:
.dockerignoreには.git/を含めるべきです — Docker に git 履歴は不要で、除外することでビルドコンテキストから数百メガバイトを削減できます。.dockerignoreにはnode_modules/を含めるべきです。Dockerfile 内で依存関係をインストールする場合でも、既存のモジュールをデーモンに送信すると時間の無駄になり、プラットフォーム不一致の問題が発生する可能性があります。Dockerfile自体を.dockerignoreに含めるべきです — ビルドプロセスは Dockerfile を別途読み取るため、コンテキスト内には不要です。
マルチステージビルドのヒント: 良い .dockerignore があっても、マルチステージビルドを使用して最終イメージを小さく保ちましょう。ビルダーステージで依存関係のインストールとビルドを行い、最小限のランタイムイメージに本番出力のみをコピーします。
セキュリティ: Docker ビルドコンテキストに .env ファイルを含めないでください。シークレットはビルド引数、Docker secrets、またはランタイム環境変数で渡してください。ビルド引数内のシークレットはイメージレイヤー履歴に残るため、本当に機密性の高い値にはランタイムインジェクションを推奨します。
ユースケース
DevOps エンジニアが、.git ディレクトリ全体と node_modules がビルドコンテキストとして Docker デーモンに送信されているため、Docker ビルドに5分かかっていることに気づきました。