Dockerを使っていて、こんな経験はありませんか?
「なんでこんなにイメージサイズが大きいの?」
「ビルドにやたら時間がかかる…」
「間違って機密ファイルがコンテナに入ってしまった」
実は、これらの問題の多くは、不要なファイルをDockerイメージに含めてしまっていることが原因かもしれません。
そこで役立つのが「.dockerignoreファイル」です。
.gitignoreと似た感覚で使え、Dockerビルドの効率を劇的に改善できる、とても便利な機能です。
この記事では、.dockerignoreの基本的な書き方から、よくある落とし穴、実務で役立つ設定例まで、初心者の方にも分かりやすく詳しく解説します。
.dockerignoreファイルって何?

基本的な概念
.dockerignore
は、Dockerがビルドする時に無視するファイルやディレクトリを指定するファイルです。
イメージで理解すると:
- 普通のDockerビルド:プロジェクト内のすべてのファイルをコンテナに送る
- .dockerignore使用:指定したファイルを除外してコンテナに送る
.gitignoreとの関係
プログラミングをしたことがある方なら「.gitignore」をご存知かもしれません。.dockerignoreは、それのDocker版だと考えてください。
項目 | .gitignore | .dockerignore |
---|---|---|
目的 | Gitでバージョン管理しないファイルを指定 | Dockerビルドに含めないファイルを指定 |
書き方 | ほぼ同じ | ほぼ同じ |
効果 | リポジトリから除外 | コンテナから除外 |
なぜ.dockerignoreが必要なの?
1. イメージサイズの削減
問題:
プロジェクト/
├── src/ (必要)
├── node_modules/ (不要 - 100MB)
├── .git/ (不要 - 50MB)
├── logs/ (不要 - 20MB)
└── README.md (必要)
上記のプロジェクトをそのままDockerイメージにすると、不要な170MBも含まれてしまいます。
解決: .dockerignoreで不要なファイルを除外すれば、イメージサイズを大幅に削減できます。
2. セキュリティの向上
危険な例:
.env # API キーやパスワード
secrets.json # 機密情報
id_rsa # SSH 秘密鍵
これらのファイルがうっかりコンテナに含まれると、セキュリティリスクになります。
3. ビルド速度の改善
不要なファイルを送らないことで:
- ネットワーク転送時間が短縮
- Docker Daemon での処理時間が短縮
- 全体的なビルド時間が改善
実際の効果例:
- ビルド前:5分
- .dockerignore使用後:30秒
このような劇的な改善も珍しくありません。
基本的な書き方
ファイルの作成
プロジェクトのルートディレクトリ(Dockerfileと同じ場所)に .dockerignore
というファイルを作成します。
ファイル構成例:
プロジェクト/
├── Dockerfile
├── .dockerignore ← ここに作成
├── src/
└── package.json
基本的な記述方法
1行に1つずつ、除外したいファイルやディレクトリを書きます:
node_modules
.git
*.log
.env
.DS_Store
パターンマッチング
.dockerignoreでは、以下のようなパターンが使えます:
パターン | 意味 | 例 |
---|---|---|
* | 任意の文字列 | *.log → すべての.logファイル |
? | 任意の1文字 | test?.txt → test1.txt, testA.txt など |
** | 任意の階層 | **/tmp → どの階層のtmpフォルダも |
! | 除外の例外 | !important.log → important.logは含める |
よく使う.dockerignoreパターン例

Node.jsプロジェクトの場合
# 依存関係
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# 環境設定
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# ビルド成果物
dist/
build/
coverage/
# エディタ設定
.vscode/
.idea/
# OS関連
.DS_Store
Thumbs.db
Pythonプロジェクトの場合
# Python関連
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
# 仮想環境
venv/
.venv/
env/
.env/
# 環境設定
.env
.env.*
# テスト・カバレッジ
.coverage
.pytest_cache/
.tox/
# Jupyter Notebook
.ipynb_checkpoints
# OS関連
.DS_Store
*.swp
*.swo
Java/Spring Bootプロジェクトの場合
# ビルド成果物
target/
build/
*.jar
*.war
# IDE設定
.idea/
.vscode/
*.iml
# 環境設定
.env
application-local.properties
# OS関連
.DS_Store
Thumbs.db
# Git関連
.git/
.gitignore
汎用的なおすすめ設定
どんなプロジェクトでも使える基本的な設定:
# バージョン管理
.git/
.gitignore
# 環境設定・機密情報
.env
.env.*
secrets.yml
config/secrets/
# ログファイル
*.log
logs/
# 一時ファイル
tmp/
temp/
*.tmp
# OS関連
.DS_Store
Thumbs.db
*.swp
*.swo
# エディタ設定
.vscode/
.idea/
*.sublime-*
# ドキュメント(必要に応じて)
README.md
docs/
*.md
注意点と落とし穴
1. .dockerignoreの配置場所
よくある間違い:
プロジェクト/
├── docker/
│ ├── Dockerfile
│ └── .dockerignore ← ここだと無効
└── .dockerignore ← 正しい場所
.dockerignoreは、必ずDockerfileと同じディレクトリに配置してください。
2. 必要なファイルまで除外してしまう
危険な例:
# これは危険
*
!src/
すべてを除外してsrcだけ含める設定ですが、package.jsonやDockerfileまで除外してしまう可能性があります。
安全な書き方:
# 明示的に不要なものだけ除外
node_modules/
.git/
*.log
3. キャッシュの問題
.dockerignoreを更新しても、Dockerのキャッシュにより変更が反映されない場合があります。
解決方法:
# キャッシュを無視してビルド
docker build --no-cache -t myapp .
# または古いイメージを削除
docker system prune -a
4. 除外パターンの優先順位
# この順番だと、important.logも除外される
*.log
!important.log
# 正しい順番
!important.log
*.log
**ルール:**より具体的なパターンを先に書く
実践的な使い方

開発環境と本番環境で使い分け
開発用 .dockerignore:
node_modules/
.git/
.env.production
本番用 .dockerignore:
node_modules/
.git/
.env.development
.env.local
test/
docs/
マルチステージビルドとの組み合わせ
# 開発ステージ
FROM node:18 AS development
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# 本番ステージ
FROM node:18-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=development /app/dist ./dist
この場合、.dockerignoreで開発用ファイルを除外しつつ、必要なファイルだけを本番ステージにコピーできます。
よくある質問
Q1. .dockerignoreがあるのに、ファイルがコンテナに含まれてしまいます
A. 以下を確認してください:
- .dockerignoreの配置場所(Dockerfileと同じディレクトリ)
- ファイルの文字コード(UTF-8で保存)
- パターンの書き方(スペースや特殊文字に注意)
Q2. .gitignoreの内容をそのまま使っても大丈夫?
A. 基本的には大丈夫ですが、以下に注意:
- Dockerfileやdocker-compose.ymlは除外しない
- 本番環境で必要なファイルは含める
- セキュリティ面でより厳しくチェック
Q3. 除外したファイルのサイズを確認したい
A. 以下のコマンドで確認できます:
# 除外前後のビルドコンテキストサイズを比較
docker build --progress=plain -t test . 2>&1 | grep "transferring context"
Q4. 複数のDockerfileで異なる.dockerignoreを使いたい
A. 残念ながら、1つのディレクトリに1つの.dockerignoreしか使えません。代替案:
- サブディレクトリに分ける
- docker buildの-fオプションでDockerfileの場所を指定
- マルチステージビルドを活用
まとめ
.dockerignoreは、Dockerビルドを効率化するための必須ファイルです。正しく設定することで、イメージの軽量化・セキュリティ向上・ビルド時間短縮と、まさに一石三鳥の効果が得られます。
この記事の重要なポイント:
- .dockerignoreはビルド対象から除外するファイルを指定する設定ファイル
- .gitignoreと似た書き方ができるが、目的が異なる
- 不要ファイルの除外でセキュリティと効率が大幅に向上
- 必要なファイルまで除外しないよう注意が必要
- Dockerfileと同じディレクトリに配置することが重要
初心者の方へのアドバイス:
- まずは基本的なパターン(.git、*.log、.envなど)から始めましょう
- プロジェクトに合わせて少しずつパターンを追加していきましょう
- ビルド前後でイメージサイズを比較して効果を確認しましょう
- 除外しすぎた場合は、アプリが正常に動作するかテストしましょう
覚えておくべき基本パターン:
# 基本セット
.git/
*.log
.env
.DS_Store
tmp/
# 言語別
node_modules/ # Node.js
__pycache__/ # Python
target/ # Java
vendor/ # PHP
コメント