第10章:最小Dockerfileを作る(まずはJS)🧱✨
この章は「最小で再現できるDockerfile」を、手を動かして“完成”させる回です🐳💨 ゴールはこれ👇
- ✅
docker buildが通る - ✅
docker runでJSが動く - ✅ 依存は
npm ciで毎回クリーンに入る - ✅ ベースは Active LTSのNode v24 を使う(安定路線) (nodejs.org)
1) まず全体像を1分で理解しよう🧠✨
Dockerfileは「アプリが動く箱(イメージ)を作るレシピ」です🍳📄
FROM:どの土台(Node入りOS)から始める?WORKDIR:作業する場所(フォルダ)どこ?COPY:必要なファイルを箱に入れるRUN:箱の中でコマンドを実行(例:依存インストール)CMD:箱を起動したときに動く“最後の命令”🚀
今回の土台は node:24-bookworm-slim を採用します🟢
bookworm みたいな名前は Debianのリリース名で、これを明示すると将来の揺れが減りやすいよ、という考え方です (hub.docker.com)
2) 最小プロジェクトを用意する📁✨(ホストにNode不要ルート)
ここ、ちょっと気持ちいいポイントです😆✨
npm init や npm i も DockerのNodeで実行して、最初から揺れを減らします🔒
フォルダ構成(完成形)🧩
runtime-fixed-js/
├─ src/
│ └─ index.js
├─ package.json
├─ package-lock.json
└─ Dockerfile
2-1) フォルダとJSファイルを作る✍️
runtime-fixed-js を作って、src/index.js を作成👇
const dayjs = require("dayjs");
console.log("Hello from container! 🐳✨");
console.log("Now:", dayjs().format("YYYY-MM-DD HH:mm:ss"));
2-2) package.json と lockfile を“コンテナのnpm”で作る📦🔧(PowerShell想定)
VS Codeのターミナルで、フォルダ直下で実行👇
## package.json を作る
docker run --rm -it -v "${PWD}:/app" -w /app node:24-bookworm-slim npm init -y
## 依存を1個だけ入れる(lockfile を確実に作るため)
docker run --rm -it -v "${PWD}:/app" -w /app node:24-bookworm-slim npm i dayjs
これで package-lock.json ができて、次の npm ci が使える状態になります👍✨
3) 最小Dockerfileを書く🧱✨(この章の主役)
プロジェクト直下に Dockerfile を作って、これを書いてください👇
FROM node:24-bookworm-slim
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["node", "src/index.js"]
1行ずつ“意図”を理解しよう👀🧠
-
FROM node:24-bookworm-slimNode入りの土台を選ぶ。v24はActive LTSで、基本はこの路線が安心 (nodejs.org) -
WORKDIR /appこれ以降の作業場所を/appに固定。迷子防止🧭 -
COPY package.json package-lock.json ./→RUN npm ciここが型です⚡ 依存定義だけ先に入れてnpm ciすることで、ソースをちょっと変えたくらいでは依存の層がキャッシュされやすい(速くなりやすい) そしてnpm ciは lockfile前提のクリーンインストールで、ズレたら止めてくれるのが強い (docs.npmjs.com) -
COPY . .最後にソース全部を箱に入れる📦 -
CMD ["node", "src/index.js"]起動したらこれを実行!🚀
4) ビルドして動かす🐳💨
プロジェクト直下で👇
docker build -t runtime-fixed-js:dev .
docker run --rm runtime-fixed-js:dev
成功すると、こんな感じで出ます👇
Hello from container! 🐳✨- 日付が表示される🕒
5) “固定できてる?”を一瞬で確かめる✅🔁
5-1) Nodeの版を確認(コンテナの中で)🔍
docker run --rm runtime-fixed-js:dev node -v
v24... になっていればOK🙆♂️(Active LTSの枝であることは公式表にも出ています) (nodejs.org)
6) つまずきポイント集(ここで詰まりがち)💣🧯
❌ npm ci が「package-lock がない」って怒る
原因:package-lock.json が無い
対処:一度 npm i を実行して lockfile を作る(さっきの手順)
npm ci は lockfile 前提で、クリーンに入れるコマンドです (docs.npmjs.com)
❌ npm ci が「package.json と lock の内容が違う」って怒る
原因:package.json を編集したのに lockfile を更新してない
対処:コンテナで npm i を実行して lock を更新 → その後 npm ci に戻す
npm ci は「ズレたら止める」が仕事です(えらい) (docs.npmjs.com)
❌ ビルドが遅い(毎回依存を入れ直してる気がする)
原因:COPY . . が先に来てる、などでキャッシュが効かない
対処:依存系だけ先に COPY → npm ci → 最後にソース COPY の順にする(今のDockerfileがその形)
(一般論としても、Dockerは“キャッシュが効く並べ方”が重要) (Docker Documentation)
7) ミニ演習(理解が一気に定着する)🎯🔥
演習A:依存を増やしてみる📦✨
src/index.jsに1行足して、例えばdayjs().add(1, "day")を表示docker build→docker run- 「JSだけ変えたのに、依存インストールは再実行されにくい」を体感⚡
演習B:起動時に“固定チェックログ”を出す✅
src/index.js に👇を追加(超おすすめ癖)
console.log("Node:", process.version);
8) AIに手伝わせるコツ🤖✨(速く・でも丸投げしない)
- GitHubのGitHub Copilot に頼むなら:
「このフォルダ構成で最小のDockerfileとpackage.jsonを作って。
npm ci前提で、Nodeはnode:24-bookworm-slim」 - OpenAI Codex 系に頼むなら: 「Dockerfileの各行の意図を“初心者向け”にコメント付きで説明して」
そして最後は必ず自分の目で👇だけ確認👀✅
COPY package*.json → npm ci → COPY .の順になってる?npm ciを使ってる?(npm installじゃない?) (docs.npmjs.com)
まとめ🎁✨
この章で手に入れたのは、**最小で再現できるDockerfileの“型”**です🧱✨ 特にこの2つが核👇
node:24-bookworm-slimで土台を固定(安定路線) (nodejs.org)npm ciで依存を毎回クリーンに揃える (docs.npmjs.com)
次の章(第11章)は、npm ci をもっと味方につけて「ズレを検知して直す」運用に入ります🧼📦🔥