ビルドコンテキストから除外する - .dockerignore
ビルドコンテキストから不要ファイルを除外する設定ファイル。ビルド時間・イメージサイズ・秘密情報漏洩対策の 3 点で重要。
概念図
構文
# .dockerignore
<pattern>
!<negate-pattern>
# 例
node_modules
.git
**/*.log
!config/keep.log実例
Node 用の典型例。ビルドで生成される node_modules と .env を除外
# Node プロジェクト用の .dockerignore
node_modules
npm-debug.log*
.git
.gitignore
.env
.env.*
dist
coverage
.vscode
Dockerfile
.dockerignoreホワイトリスト方式。誤コピー防止に強い
# 全部除外してから必要なものだけ戻す
*
!src/
!package.json
!package-lock.json`.dockerignore` の役割
docker build は Dockerfile のあるディレクトリ(ビルドコンテキスト)を丸ごとデーモンに送る。
.dockerignore はこの送信から除外するパターンを定義する。
node_modules、.git、ビルド成果物、.env などを除外することで、送信データが小さくなりビルドが速くなる、不要ファイルがイメージに混ざらない、.env に入った秘密情報がイメージレイヤーに焼き込まれる事故を防げる、という 3 つの効果がある。
.dockerignore はプロジェクトルートに置き、docker build 実行時に自動で読み込まれる。
`.gitignore` との違い
.gitignore は Git のコミット対象から除外するファイルの定義、.dockerignore はビルドコンテキストから除外するファイルの定義で、目的と対象が異なる。
両者のパターンは似ているが完全に一致はしない。
たとえば Dockerfile 自身は .gitignore には含めないが、.dockerignore に書いても docker build には影響しない(Dockerfile は別経路で読まれる)。
README.md や docs/ は Git では追跡するが Docker イメージには不要なので .dockerignore に入れる。
逆にローカル生成物(dist/ など)は両方で除外するのが普通。
よくある除外パターン(node_modules / .git / build)
最低限除外したいのは 4 種類。
1 つ目は依存ディレクトリ(node_modules、vendor/、__pycache__、target/ など)で、コンテナ内で再インストールすれば良い。
2 つ目は VCS メタデータ(.git、.hg)で、サイズが大きく漏洩時のリスクも高い。
3 つ目はローカルのビルド成果物や IDE 設定(dist、build、.vscode、.idea)。
4 つ目は環境固有の秘密情報(.env、*.pem、credentials.json)。
必要なファイルだけを通すホワイトリスト方式(* で全除外 → ! で戻す)は、事故防止には一番堅実。
# ホワイトリスト方式の例
*
# 戻すものだけ明示
!Dockerfile
!package.json
!package-lock.json
!tsconfig.json
!src/関連トピック
Dockerfile- Dockerfile はイメージを組み立てる手順書。ベースの選択から依存インストール、アプリ配置、起動コマンドまでをテキストで宣言し、`docker build` で一発でイメージ化する。 Dockerfile instructions- Dockerfile の命令リファレンス。FROM でベースを決め、RUN・COPY・WORKDIR・ENV・CMD・ENTRYPOINT を順番に並べる。 layer cache- Dockerfile の命令順序と BuildKit のマウント機能を使い、再ビルドを最短化する。 image size- 軽量ベースイメージの選定、不要ファイルの削除、マルチステージの活用でイメージサイズを抑える。 