第05章:ビルドコンテキストを小さくする(体感で速くなる)🎒➡️🪶
この章のテーマは超シンプル! **「Dockerビルドで送る荷物(=ビルドコンテキスト)を減らす」**だけで、ビルドが体感で速くなります ⚡️✨
✅この章でできるようになること
.dockerignoreを書いて、**不要ファイルを“最初から送らない”**ようにできる 📦🚫- 今どれくらい送ってるかをログで確認できる 👀
- Node/TypeScript案件でよくある “重いヤツら(node_modules / dist / .git …)” を一撃で除外できる 🧹✨
- 複数Dockerfileがあるときの「Dockerfileごとの ignore」も使える(地味に便利)🧠
1) そもそも「ビルドコンテキスト」って何?🎁
Docker はビルドを始める前に、**指定したフォルダ(context)を“ビルダーに渡す”**必要があります。 この「渡す荷物一式」が ビルドコンテキストです 📦
docker build .なら.(カレントディレクトリ)がコンテキスト- Compose でも
build: ./build: { context: ... }の context が基準になります 🧭 (Docker Documentation)
そして .dockerignore は、その荷物から **「これは入れないで!」**を指定するフィルタです 🎛️
Docker公式でも .dockerignore は「ビルドコンテキストから除外する」仕組みとして説明されています。(Docker Documentation)
2) 「今、どれだけ送ってるか」を見よう 👀📏
まずは現状把握! BuildKit のログには、だいたいこんな行が出ます:
load .dockerignoretransferring context: XXX(←ココが超重要!)(Docker ドキュメント)
🔎おすすめコマンド(ログをわかりやすくする)
A. 普通の build(BuildKit)
docker build --progress=plain -t myapp:dev .
--progress は plain にすると詳細が出やすいです 🧾✨(buildx でも同様)(Docker Documentation)
B. Compose の build(最近のCLIは “全体オプション” が強い)
Compose は --progress が docker compose 側のオプションとして載っています。なので👇が安定です:(Docker Documentation)
docker compose --progress=plain build
ここで “transferring context” がデカいなら勝ち確です 😎⚡️
3) .dockerignore を作る(これだけで速くなる)🧹⚡️
プロジェクトの **ルート(ビルドコンテキストのルート)**に .dockerignore を置きます。
中身は「1行1パターン」。パターンはシェルのglobっぽい感じで、** も使えます。(Docker Documentation)
✅まずは“鉄板テンプレ”(Node + TypeScript向け)📦🧱
以下を そのまま置いて、あとで調整でOKです 🙆♂️✨
## ---- deps ----
node_modules
.pnpm-store
.yarn
.yarn-cache
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
## ---- build outputs ----
dist
build
out
coverage
.tmp
.cache
.eslintcache
*.tsbuildinfo
## ---- VCS / editor ----
.git
.gitignore
.gitattributes
.vscode
.idea
## ---- OS junk ----
Thumbs.db
.DS_Store
## ---- env / secrets (基本: イメージに入れない) ----
.env
.env.*
*.pem
*.key
💡ポイント:
node_modulesは サイズが爆発しがちなので、入ってたらビルドが遅くなりやすいです 🐢💦dist/build/coverageなどの生成物も、送るだけムダになりがち 🗑️
4) “効いたかどうか”を確認する ✅📉
さっきと同じコマンドで、ログの transferring context を見比べます!
docker build --progress=plain -t myapp:dev .
ここで例えば…
- 改善前:
transferring context: 1.2GB😱 - 改善後:
transferring context: 6.5MB😳✨
みたいになったら、その時点で体感速度が変わることが多いです ⚡️
5) ちょい大事:.dockerignore のルール(最低限だけ)📌
✅ルール1:コメントは #(先頭にある時だけ)
.dockerignore は # から始まる行をコメント扱いにします。(Docker Documentation)
✅ルール2:** が使える(全部の階層に効かせたい時)
Docker は ** という特別なワイルドカードをサポートしていて、何階層でもマッチできます。
例:**/*.go は「どこにあっても .go を除外」みたいな意味になります。(Docker Documentation)
✅ルール3:Dockerfile や .dockerignore 自体も “除外指定” できる
ただし、それらはビルドに必要なので 送信自体はされるけど、ADD/COPY などで イメージにはコピーできないです。(Docker Documentation)
(「うっかりDockerfileがイメージに入る」みたいな事故が減るので安心 😌)
6) 複数Dockerfileがあるなら「Dockerfileごとの ignore」も便利 🧠🗂️
テスト用・lint用・本番用など Dockerfile が複数あるとき、 Docker公式に Dockerfile専用の ignore ファイルの仕組みがあります。
例:
docker/build.Dockerfiledocker/build.Dockerfile.dockerignore← これが build 用にだけ効く しかも、これがある場合は ルートの.dockerignoreより優先されます。(Docker Documentation)
「lintビルドだけ src 全部要らない」みたいなときに刺さります 🔥
🧪ミニ演習(5〜15分)⏱️✨
演習1:現状の“荷物サイズ”を測る 📏
docker build --progress=plain ...でビルド- ログの
transferring contextをメモ 📝
演習2:.dockerignore を入れてもう一度測る 🧹
- テンプレを置く
- 同じコマンドでもう一回ビルド
transferring contextの差をメモしてニヤニヤする 😏⚡️
演習3:一番デカい犯人を当てる 🎯
node_modulesが入ってた?.gitが入ってた?dist/coverageなどの生成物が入ってた? → “犯人トップ1” を決めて、次章(罠あるある)に備える 🕵️♂️✨
🤖AI活用(Copilot / Codex で爆速)🧠⚡️
※ここでは **「丸投げ」じゃなくて「良い叩き台を出させる」**のがコツです 👍
プロンプト1:プロジェクトに合う .dockerignore を作らせる 🧰
あなたはDocker最適化の専門家です。
Node + TypeScript のリポジトリ向けに .dockerignore を作ってください。
条件:
- build成果物(dist/build/coverage)は除外
- node_modulesは除外
- .git とエディタ設定も除外
- ただし Dockerfile で COPY する可能性がある設定ファイルは除外しすぎないよう注意点も添えて
出力: .dockerignore の内容だけ
プロンプト2:“除外しすぎ事故”を防ぐレビュー 🛡️
この .dockerignore をレビューして、危険な除外がないか指摘して。
特に「ビルドに必要なファイル」まで消していないかをチェックして、修正版も提案して。
プロンプト3:モノレポの最適な context を提案させる 🧭
モノレポ構成です。Docker build の context をどこに置くべきか提案して。
「送る荷物を最小化」する観点で、compose.yaml の build.context 設計案も出して。
(Compose の build.context はルールが明確なので、AIに設計させるのも相性いいです 🧠✨)(Docker Documentation)
✅章末チェックリスト(できたら勝ち!)🏁🎉
-
docker build --progress=plainでtransferring contextを確認できる 👀(Docker ドキュメント) -
.dockerignoreを作って、node_modules/dist/.gitを除外した 🧹 -
transferring contextが目に見えて減った 📉✨ - (複数Dockerfileなら)
<Dockerfile>.dockerignoreの存在を知った 🗂️(Docker Documentation)
次の第6章では、この .dockerignore が **「効いてない…😵」**ってなる“罠”を、あるある形式で潰していきます 🕳️➡️🧱✨