第50章:ミニまとめ:自分のNode/TSをDockerfileで動かす🏁
ここは「Dockerfileの各パーツ(FROM/COPY/RUN/CMD…)」を合体させて、自分のTodo APIを“ちゃんと”コンテナで起動できる状態にする回だよ〜!🎉 この章が終わると、Dockerfileを見てもビビらないし、自分で直せるようになる💪😆
1) 今日のゴール🎯✨
- ✅ Todo API を Dockerfileでビルドできる
- ✅ コンテナ起動 → ログ確認 → 停止/片付け まで一気通貫できる
- ✅ 「なぜその書き方?」が “ふんわり” じゃなくなる🧠✨
- ✅ 本番寄りの最小セット(重すぎない・危険すぎない)にする🔐📦
※Nodeは偶数版がLTSになって本番向き、という公式の考え方があるので、ここでは Active LTSの v24系 をベースに進めるよ🟩(2026-02時点で v24 が Active LTS、v25 は Current)(nodejs.org)
2) まず全体像を1枚で🗺️✨
ざっくりこういう流れ👇
- 依存を入れる(npm ci)📥
- TypeScriptをビルド(dist/ を作る)🏗️
- 本番に不要なdev依存を落とす(npm prune)🧹
- 実行用の薄いイメージで起動(node dist/…)🚀
ポイント:「ビルド」と「実行」を分けると、軽くて安全になりやすいよ〜📦✨(マルチステージの考え方)(Snyk)
3) .dockerignore を作る🧹(超重要!)
Dockerfileの前にこれ! 余計なファイルを送らないだけで、ビルドが速くなるし、イメージが太りにくい🐢➡️🐇
プロジェクト直下に .dockerignore を作って、まずはこれでOK👇
node_modules
dist
.git
.vscode
.DS_Store
npm-debug.log
.env
.env.*
README.Docker.md
node_modules:ホスト側のはOSが違うと事故る率UP💥dist:ビルドで作るから、基本は入れない(Docker内で生成)🏗️.env:うっかり入れると情報漏れの元で危険😱🔐
4) Dockerfile(“本番寄り最小セット”)を書く🧾🔥
ここが本体!✨
Dockerfile をプロジェクト直下に作って、まずはこれをコピペしてOK👇
ベースは
node:24-bookworm-slimを採用(タグとして実在&slimの説明も公式にあるよ)(Docker Hub) さらに本番では:latestを避けて、できればバージョン固定が推奨だよ〜🏷️(Snyk)
## syntax=docker/dockerfile:1
FROM node:24-bookworm-slim AS build
WORKDIR /app
## 1) 依存だけ先に入れる(キャッシュが効いて速い⚡)
COPY package.json package-lock.json ./
RUN npm ci
## 2) ソースを入れてビルド(TS → dist)
COPY . .
RUN npm run build
## 3) dev依存を落として本番寄りにする🧹
RUN npm prune --omit=dev
FROM node:24-bookworm-slim AS runner
WORKDIR /app
ENV NODE_ENV=production
## 任意:このコンテナは3000番を使うよ〜の目印(機能的に必須ではない)
EXPOSE 3000
## 実行に必要なものだけコピー
COPY --from=build /app/package.json ./package.json
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
## 公式nodeイメージにいる "node" ユーザーで動かす(root回避)🔐
USER node
## ✅ npm経由じゃなく node を直起動(シグナルや挙動が読みやすい👍)
CMD ["node", "dist/index.js"]
✍️ ここだけ自分のプロジェクトに合わせて直してね🛠️
dist/index.jsの部分は、あなたのエントリに合わせる! 例:dist/server.jsとかdist/main.jsとか📌
5) ビルドしてみよう🏗️🔥
VS Codeのターミナルでプロジェクト直下へ移動して…
docker build --pull -t todo-api:dockerfile .
--pull:ベースイメージの更新を取りにいく(“最新の土台”で作れる)🔄-t:タグ。あとで呼びやすい名前にしてるよ🏷️
6) 起動して、ログ見て、触ってみる🚀🪵👀
起動(おすすめ:--init 付き)🧠✨
Nodeはコンテナ内でPID 1問題が出ることがあるので、--init を付けると安心度UP(軽量initが入って、シグナルやゾンビ回収を助けてくれる)🛟
--init はDocker公式ドキュメントにもあるよ(docs.docker.jp)
docker run --init --name todo-api -p 3000:3000 todo-api:dockerfile
別ターミナルでログを見る🪵✨
docker logs -f todo-api
停止🛑
docker stop todo-api
片付け(コンテナ削除)🧹
docker rm todo-api
「起動→ログ→停止→削除」まで行けたら、もう一段階強い💪😆
7) よくある“詰まりポイント”10連発🪤😵💫(対処つき)
npm ciが失敗する
- ✅
package-lock.jsonが無い/古い/壊れてるパターン - 👉 ローカルで
npm install→ lock生成/更新してから再ビルド🔁
npm run buildが失敗する
- ✅ TSのビルド設定(tsconfig)や
dist/出力が無い - 👉
tsconfig.jsonのoutDirを確認、dist/が出るように📦
- 起動したのにすぐ落ちる💥
- ✅
CMD ["node","dist/index.js"]のパスが違う - 👉
dist/の中身を確認して、正しいファイル名に変更📌
- ポートが見えない🚪❌
- ✅ アプリが
3000で待ってない - 👉 アプリ側の
PORTを確認、必要なら-e PORT=3000を付ける🎛️
node_modulesが無いと言われる📦❌
- ✅ prune/omitの扱いミス、またはCOPY順序ミス
- 👉 まずはこの章のDockerfileに戻す(動く状態を固定)🔙
- Windows改行/パスで変な挙動🪟😵
- ✅ スクリプトがLF/CRLFでコケる系
- 👉 まずはログで症状を確認、必要なら
.gitattributesも検討📄
- ビルドが遅い🐢
- ✅
COPY . .が早すぎてキャッシュが効かない - 👉 依存(package*.json)を先にCOPYしてからnpm系を実行⚡
- イメージが太い🐘
- ✅ 無駄ファイルが入ってる / dev依存が残ってる
- 👉
.dockerignoreとnpm prune --omit=devを再確認🧹
- コンテナ停止が遅い/止まらない😱
- ✅ PID1やシグナル周り
- 👉
--initを付ける(まずこれ)🛟(docs.docker.jp)
- 「とりあえず動く」けど本番が怖い😨
- ✅ タグが曖昧(latest) / 依存がブレる
- 👉 バージョン指定(例:
node:24-bookworm-slim)& lock を信じる🏷️(Snyk)
8) AIに頼むと強いところ🤖✨(そのまま投げてOK)
🧾 Dockerfileレビューお願い
- 「このDockerfile、危険な点とムダと改善案を3つずつ教えて。初心者向けに理由も!」🧠
🪵 ログ解析お願い
- 「このログを見て、原因候補トップ3と、確認コマンドを順番に出して」🔍
🧹 .dockerignore 提案
- 「Node/TSのAPIで、Dockerビルドを速くしたい。
.dockerignoreのおすすめを“最小”で」⚡
9) ミニ課題(5〜15分)🎮✨
- 🧪 エントリファイルを間違えて起動失敗させて、ログから直す
- 🎛️
-e PORT=3000を付けて、環境変数で動くことを確認 - 🏷️ タグを
todo-api:1にして、:dockerfileと並行管理してみる - 🧹
.dockerignoreを外してビルド→戻してビルド、速度差を体感⚡
10) 最終チェックリスト✅🏁
-
docker build -t todo-api:dockerfile .が通る🏗️ -
docker run --init -p 3000:3000 ...で起動できる🚀(docs.docker.jp) -
docker logs -fで動いてるのが読める🪵 -
docker stop→docker rmまでできる🧹 -
.dockerignoreが入ってる🧽 -
USER nodeでroot回避してる🔐 -
CMD ["node", ...]で “実行が分かりやすい” 状態になってる👍
おまけ:最短で雛形を作る方法(知っておくと便利)🧰✨
「自分で書ける」のが一番えらいんだけど、雛形が欲しい時は docker init で Dockerfile / compose / .dockerignore を自動生成もできるよ🤖📦(Docker公式ガイド)(Docker Documentation)
次の第51章からは「わざと壊して直す」デバッグ筋トレ編だね🏋️♂️🔥 もし今のTodo APIの エントリファイル名(distの中身) が標準と違うなら、この章のDockerfileを“あなたの構成に合わせた完成版”に寄せて最適化してあげるよ😆✨