第10章:.dockerignore:速さと安全の地味王 👑🧹
「なんかDocker build遅い…😵」「うっかり秘密ファイル入ってそうで怖い…😱」 この2つ、.dockerignore でかなり解決します✨
この章でできるようになること 🎯✨
docker buildが遅くなる“真犯人”=ビルドコンテキストを説明できる 📦🕵️- .dockerignore を自分のプロジェクトに合わせて書ける 📝✅
- 秘密情報(.env とか)を混入させない習慣がつく 🔒🧯
10.1 .dockerignore は「荷物を減らす袋」だよ 📦➡️🪶
docker build . をやると、Docker はまず “ビルドに使う材料一式(=ビルドコンテキスト)” を集めます。
このとき .dockerignore があると、いらないファイルを事前に落としてからビルダーへ送ります🚚💨
結果として ビルドが速くなるし、余計なもの(秘密・巨大ログ等)が混ざりにくくなります✨ (Docker Documentation)
さらに最近の Docker Build / BuildKit は、コンテキスト転送を賢く省略したり、差分転送をしたりもします。とはいえ「そもそも送らない」効果が強いので、.dockerignore はまだまだ重要です⚡ (Docker Documentation)
10.2 .dockerignore の基本ルール(ここだけ覚えれば勝ち)🏆📝
置き場所 📍
docker buildすると、コンテキストのルートにある.dockerignoreを探して使います。 (Docker Documentation)
書き方 📜
-
1行=1パターン(Unix の glob っぽい書き方) (Docker Documentation)
-
#で始まる行はコメント(無視される)💬 (Docker Documentation) -
先頭/末尾の
/は基本あまり気にしなくてOK(無視される扱い)✂️ (Docker Documentation) -
**は **“何階層でも”**にマッチする特別ワイルドカード 🌲🌲🌲 (Docker Documentation)- 例:
**/*.log→ どこにある.logでも対象
- 例:
-
!は 除外の例外(戻す) ✅ (Docker Documentation)- しかも 後に書いたルールが勝つ(順番が超大事)🔥 (Docker Documentation)
ちょい注意ポイント ⚠️
.dockerignoreで除外したファイルは、ビルド材料から消えるので、COPY/ADDしようとしても ビルドエラーになります😵 (Docker Documentation) → 「あ、これコンテキストに存在しないよ?」って怒られるやつです💥
10.3 コピペでOK:Node/TypeScript向け .dockerignore テンプレ 🧩✨
まずはこれを入れて、あとから調整が一番ラクです😆 (“本番イメージはDocker内で依存を入れてビルドする”想定の定番セット)
## ===== 依存フォルダ(ホスト側) =====
node_modules
**/node_modules
## ===== Git・エディタ系 =====
.git
.gitignore
.vscode
.idea
## ===== ローカル設定/秘密系(事故防止) =====
.env
.env.*
*.pem
*.key
*id_rsa*
*id_ed25519*
npmrc
.yarnrc
.pnpmrc
## ===== 生成物・キャッシュ =====
dist
build
coverage
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
.cache
tmp
temp
## ===== OS系のゴミ =====
.DS_Store
Thumbs.db
ポイント🙂
node_modulesは ほぼ毎回入れるやつです(巨大&いらない代表)👑 (Docker Documentation).envや.gitも “うっかり混入” しがちなので、早めにガード🔒 (Docker Documentation)
10.4 ハンズオン:速くなるのを目で見る 👀⚡
Step 1:いったん「遅い状態」を観察する 🐢
プロジェクトのルートで👇
docker build --progress=plain -t demo:before .
出力ログのどこかに “transferring context” みたいな行が出ます。 ここが デカい=荷物が重い ってことです📦💦(とくにリモートビルダーだと効きます) (Docker Documentation)
Step 2:.dockerignore を作って貼る 🧹
さっきのテンプレを .dockerignore に保存📝
Step 3:もう一回ビルドして比較 🔥
docker build --progress=plain -t demo:after .
✅ 期待する変化
- “transferring context” のサイズが 激減 📉✨
- 体感でもビルドが 速くなる 🚀
10.5 セキュリティ的に「地味だけど最重要」🔒🧯
.dockerignore の価値は速さだけじゃないです👀
秘密ファイルが“ビルド材料に入らない” だけで、事故率がガクッと落ちます😇✨ (Docker Documentation)
ただし⚠️
- 「ビルド時に秘密が必要」なケース(プライベート依存、秘密トークンでの取得など)は、
.envをコピーするんじゃなくて、Docker Build の secrets 機能を使う方向が安全です🔑✨ (Docker Documentation)
10.6 つまずきTop6 😵💫🧩(めっちゃあるある)
-
ビルドが急に失敗した(COPYできない) 😱 →
.dockerignoreに入れたせいで、コンテキストから消えてます。COPY対象を見直すか、除外ルールを調整! (Docker Documentation) -
distを無意識に除外して、**「dist前提のDockerfile」**と衝突する 🧨 → どっちの方式?
- Docker内でビルドするなら
dist除外でOK - ホストでビルドして
distをコピーするならdistは除外しない
-
node_modulesを除外し忘れて、ビルドが重すぎ問題 🐘 →node_modulesと**/node_modulesを入れよう (Docker Documentation) -
!(例外)を書いたのに効かない 😭 → 順番が命!最後にマッチしたルールが勝ちます🔥 (Docker Documentation) -
「/foo って書いたら foo の直下だけだよね?」と思う 🙃 →
.dockerignoreの/は 直感と違う動きになりやすいので、迷ったら--progress=plainで確認が早いです(まず動かして確認😆) (Docker Documentation) -
.dockerignoreに Dockerfile を書いて「隠した!」と思う 🥷 → Dockerfile と.dockerignore自体は、ビルドに必要なので送られます。しかもCOPYもできません(=隠し持てない) (Docker Documentation)
10.7 応用:Dockerfileが複数あるなら、ignoreも分けられる 🧠✨
プロジェクトによっては
build.Dockerfile(本番用)lint.Dockerfile(Lintだけ用)test.Dockerfile(テスト用) みたいに分けたくなりますよね🙂
そのとき Docker は Dockerfileごとの ignore もサポートしてます👇
build.Dockerfile.dockerignore みたいに Dockerfile名をprefixにするやつです✨ (Docker Documentation)
10.8 ミニ課題(手を動かすやつ)✅🔥
- ✅ ① いまのプロジェクトで
.dockerignoreを作る - ✅ ②
docker build --progress=plainで transferring context のサイズをメモる📝 - ✅ ③
.env/.git/node_modulesが確実に除外されてるか確認👀 - ✅ ④ もしビルドが壊れたら「どの COPY が原因か」突き止める(超成長ポイント)💪 (Docker Documentation)
10.9 Copilot / Codex に投げるプロンプト例 🤖💡
- 「このリポジトリ構成(ツリー貼る)から、.dockerignore の最適案を作って。安全優先で!🔒」
- 「Dockerfile の COPY と .dockerignore を照合して、壊れそうな箇所を指摘して😵」
- 「monorepo なんだけど、packages ごとに node_modules がある。無駄なく除外するパターン教えて(** の使い方込み)🌲」
- 「“秘密が混ざりそうなファイル名”を列挙して、.dockerignore に入れる候補リスト作って🧯」
次の章(第11章)が「環境変数設計」なので、ここで .env を除外できてると超スムーズです😆🔑✨