【超入門】.dockerignoreファイルとは?|Dockerイメージ最適化の必須テクニック

Docker

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. 以下を確認してください:

  1. .dockerignoreの配置場所(Dockerfileと同じディレクトリ)
  2. ファイルの文字コード(UTF-8で保存)
  3. パターンの書き方(スペースや特殊文字に注意)

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

コメント

タイトルとURLをコピーしました