第06章:.dockerignoreの“罠あるある”😵💫📦⚡️
.dockerignore は「ビルドに持ち込む荷物(=ビルドコンテキスト)」を減らして、ビルドを速くするための超重要アイテムだよ🎒➡️🪶
でも…書き方や置き方を間違えると「消したつもりが入ってる」「必要なものまで消してビルド失敗」みたいな事故が起きがち😇
(しかも原因が分かりにくい!)(Docker Documentation)
1) まずイメージ:.dockerignoreは“荷物の持ち込み禁止リスト”🧳🚫
Docker ビルドは、最初に「コンテナに持ち込むファイル一式」を作って送るんだけど、.dockerignore はその時点で不要なものを取り除くルールだよ✂️✨
だから .dockerignore が効くと、ログにこういうのが出る👇(load .dockerignore と transferring context が目印!)(Docker Documentation)
ポイントはここ👇
.dockerignoreは **“ビルドコンテキストのルート”**にあるものが使われる🧠- ルールに当たったファイルは、送られない=存在しない扱いになる📭(Docker Documentation)
2) 罠あるある①:.dockerignore の置き場所が違う📍😵
症状:.dockerignore 書いたのに全然軽くならない/node_modules が普通に送られてそう
原因:.dockerignore は **“コンテキストのルート”**にないと見つからないことがある💥
Docker は「ビルドコマンドで指定したコンテキストのルート」を見に行くよ。(Docker Documentation)
✅ 直し方
docker build .みたいに、プロジェクトルートをコンテキストにする- もし
-fで Dockerfile の場所だけ変えてるなら、コンテキストは別物って意識する(-fは Dockerfile、最後の.がコンテキスト)💡
3) 罠あるある②:“Dockerfileごとの .dockerignore” が上書きしてくる🌀📄
症状:チームメンバーは動くのに自分だけ違う/Dockerfile変えたら急に挙動が変
原因:複数 Dockerfile を使うと、<Dockerfile名>.dockerignore が 通常の .dockerignore より優先されることがある😳(Docker Documentation)
✅ 直し方
docker/xxx.Dockerfile.dockerignoreみたいな “個別 ignore” が無いか探す🔎- 見つけたら「どっちを正」にするか決めて、ルールを揃える✨
4) 罠あるある③:パターンが“思ったより雑”で、意図せず消える🧨
.dockerignore は Unix っぽいグロブ(ワイルドカード)で書くよ🌀
しかも 先頭/末尾のスラッシュは無視されるので、「/ 付けたから厳密になる!」みたいにはならない😇(Docker Documentation)
たとえば次の4つは、全部 “同じ意味” で foo/bar を除外する👇(Docker Documentation)
/foo/bar/foo/bar//foo/barfoo/bar
✅ 対策
- 「/ 付けたらルート固定」みたいな気持ちは捨てる😂
- 迷ったら “具体例を自分で1個当てはめる” が最強💪
5) 罠あるある④:* と ** の感覚がズレる🌪️
特にやらかすのがこれ👇
*.md:ルート直下だけマッチ(サブディレクトリのdocs/a.mdは含まれることがある)**/*.md:どこにあってもマッチ(強い)(Docker Documentation)
Docker には Go の filepath.Match ベースのルール+特別な ** があるよ、って覚えるとラク🧠✨(Docker Documentation)
6) 罠あるある⑤:例外 ! の“順番”で結果が変わる🔀😵💫
! を付けると「除外の例外=入れる」ができるよ✅
でも超大事なのは “最後にマッチした行が勝つ” ってこと🏁(Docker Documentation)
たとえば👇
*.md
!README*.md
README-secret.md
→ README は入るけど、README-secret.md は最後で除外される🧠(Docker Documentation)
逆に👇
*.md
README-secret.md
!README*.md
→ !README*.md が最後に勝つので、README-secret.md も入っちゃう😇(Docker Documentation)
✅ 対策
- 例外は“後ろに書く”(ただし最後に除外したいものはもっと後ろ)
- ルールを書いたら、最後に「このファイルはどの行にマッチする?」って脳内シミュレーション🧠🧠🧠
7) 罠あるある⑥:必要なファイルまで消して COPY が死ぬ💀📦
これが一番つらい事故😭
症状:COPY package.json ... とかで「not found」系エラー
原因:.dockerignore にマッチしたファイルは ビルドコンテキストに存在しない扱いになるので、COPY / ADD できない📭(Docker Documentation)
Docker 側も「.dockerignore で除外されてるのを Copy しようとしてるよ」って警告/チェックとして説明してるよ。(Docker Documentation)
✅ 直し方(定番)
.dockerignoreから消す- もしくは
!で例外にする👇
## いったん広く消す
*.json
## でもこれは必要!
!package.json
!package-lock.json
8) 罠あるある⑦:Dockerfile / .dockerignore は“除外できるけどコピーできない”🤔📄
ちょいトリッキーなのがこれ👇
Dockerfile や .dockerignore 自体を .dockerignore で除外しても、ビルドに必要だから ビルド実行には送られる。
でもその代わり、イメージ内に COPY できない(ADD/COPY/ビルド中の bind mount も不可)って挙動になるよ。(Docker Documentation)
✅ 実務の感覚
- “入れたくないから除外する” はOK
- “コンテナにコピーしたい” 目的なら除外しない(そもそも普通はコピー不要)😂
🧪 ミニ演習:事故をわざと起こして、秒速で直す⚡️😆
演習A:COPY 失敗を体験する(→原因が一瞬で分かるようになる)💥
.dockerignoreにこれを追加👇
package*.json
- Dockerfile に依存ファイルをコピーする行がある状態でビルド
docker build --progress=plain -t demo .
- 失敗したら、次にこう直す👇
package*.json
!package.json
!package-lock.json
✅ これで「.dockerignore は“消える”」が腹落ちするはず!(Docker Documentation)
演習B:ビルド“荷物の量”をログで観察する👀📦
.dockerignoreを一時的にリネーム(例:.dockerignore.bak)docker build --progress=plain ...を実行してtransferring contextのサイズを見る.dockerignoreを戻して再実行、サイズが減るか確認!
ログに load .dockerignore と transferring context が見えたら勝ち🏆(Docker Documentation)
🧰 “ありがち除外テンプレ”を自分用に育てよう🌱✨
まずは、超よくあるやつだけでOK(あとで増やす)👇 ※プロジェクトにより必要なものは違うので、**「迷ったら一旦入れない」**が安全🛡️
## dependencies
node_modules/
## build outputs
dist/
build/
out/
coverage/
## caches
.cache/
.vite/
.turbo/
*.tsbuildinfo
## vcs / ide
.git/
.vscode/
.idea/
## logs
*.log
npm-debug.log*
yarn-debug.log*
pnpm-debug.log*
## env (扱いに注意!)
*.env*
この手の例は公式ガイドにも載ってるので、ベースにしやすいよ🧑🍳(Docker Documentation)
🤖 AI活用:.dockerignore を“事故らないように”作るプロンプト集🧠✨
1) テンプレ生成(まず叩き台)
あなたはDocker最適化のレビュー担当です。
以下のリポジトリ構成(tree)を見て、ビルドが速くなる .dockerignore を提案してください。
条件:
- Dockerfile の COPY/ADD で必要になりそうなファイルは除外しない
- secrets(例: .env) は漏れにくく
- ルールの意図をコメントで説明
tree:
(ここに tree を貼る)
Dockerfile:
(ここに Dockerfile を貼る)
2) 事故チェック(COPYが死ぬ未来を潰す)
この Dockerfile と .dockerignore の組み合わせで、
COPY/ADD が "not found" になりそうな箇所を洗い出して、
原因のルール行と修正案(!例外を含む)を出してください。
3) ! 順番レビュー(最後勝ちルールの確認)
この .dockerignore は「最後にマッチした行が勝つ」ルールです。
意図通りに例外(!)が効いているか、具体例(README-secret.md 等)で検証して、
危ない順番があれば並び替え案を出してください。
✅ 章末チェックリスト(ここだけ押さえれば事故率激減)🧷✨
-
.dockerignoreは コンテキストのルートにある?(Docker Documentation) - Dockerfile別の
*.dockerignoreが 上書きしてない?(Docker Documentation) -
*と**の意味、雑に使ってない?(Docker Documentation) -
!の例外、**順番(最後勝ち)**で壊れてない?(Docker Documentation) -
COPYしたいファイルを.dockerignoreで消してない?(消すと存在しない)(Docker Documentation) -
docker build --progress=plainで contextサイズがちゃんと減ってる?(Docker Documentation)
次の章(第7章)では、いよいよ Dockerfile の順序でキャッシュを温存して「依存インストール毎回」を止めるよ🥇⚡️
その前に、いまの .dockerignore を一緒に “あなたのプロジェクト用に最適化” してみる?😆📦✨