Dock Stay
ビルドコンテキストから除外する - .dockerignore の使い方・オプション・サンプル

ビルドコンテキストから除外する - .dockerignore

ビルドコンテキストから不要ファイルを除外する設定ファイル。ビルド時間・イメージサイズ・秘密情報漏洩対策の 3 点で重要。

概念図

.dockerignore diagram

構文

bash
# .dockerignore
<pattern>
!<negate-pattern>

# 例
node_modules
.git
**/*.log
!config/keep.log

実例

Node 用の典型例。ビルドで生成される node_modules と .env を除外

bash
# Node プロジェクト用の .dockerignore
node_modules
npm-debug.log*
.git
.gitignore
.env
.env.*
dist
coverage
.vscode
Dockerfile
.dockerignore

ホワイトリスト方式。誤コピー防止に強い

bash
# 全部除外してから必要なものだけ戻す
*
!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.mddocs/ は Git では追跡するが Docker イメージには不要なので .dockerignore に入れる。

逆にローカル生成物(dist/ など)は両方で除外するのが普通。

よくある除外パターン(node_modules / .git / build)

最低限除外したいのは 4 種類。

1 つ目は依存ディレクトリ(node_modulesvendor/__pycache__target/ など)で、コンテナ内で再インストールすれば良い。

2 つ目は VCS メタデータ(.git.hg)で、サイズが大きく漏洩時のリスクも高い。

3 つ目はローカルのビルド成果物や IDE 設定(distbuild.vscode.idea)。

4 つ目は環境固有の秘密情報(.env*.pemcredentials.json)。

必要なファイルだけを通すホワイトリスト方式(* で全除外 → ! で戻す)は、事故防止には一番堅実。

bash
# ホワイトリスト方式の例
*

# 戻すものだけ明示
!Dockerfile
!package.json
!package-lock.json
!tsconfig.json
!src/

関連トピック