Skip to main content

第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枚で🗺️✨

ざっくりこういう流れ👇

  1. 依存を入れる(npm ci)📥
  2. TypeScriptをビルド(dist/ を作る)🏗️
  3. 本番に不要なdev依存を落とす(npm prune)🧹
  4. 実行用の薄いイメージで起動(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連発🪤😵‍💫(対処つき)

  1. npm ci が失敗する
  • package-lock.json が無い/古い/壊れてるパターン
  • 👉 ローカルで npm install → lock生成/更新してから再ビルド🔁
  1. npm run build が失敗する
  • ✅ TSのビルド設定(tsconfig)や dist/ 出力が無い
  • 👉 tsconfig.jsonoutDir を確認、dist/ が出るように📦
  1. 起動したのにすぐ落ちる💥
  • CMD ["node","dist/index.js"] のパスが違う
  • 👉 dist/ の中身を確認して、正しいファイル名に変更📌
  1. ポートが見えない🚪❌
  • ✅ アプリが 3000 で待ってない
  • 👉 アプリ側の PORT を確認、必要なら -e PORT=3000 を付ける🎛️
  1. node_modules が無いと言われる📦❌
  • ✅ prune/omitの扱いミス、またはCOPY順序ミス
  • 👉 まずはこの章のDockerfileに戻す(動く状態を固定)🔙
  1. Windows改行/パスで変な挙動🪟😵
  • ✅ スクリプトがLF/CRLFでコケる系
  • 👉 まずはログで症状を確認、必要なら .gitattributes も検討📄
  1. ビルドが遅い🐢
  • COPY . . が早すぎてキャッシュが効かない
  • 👉 依存(package*.json)を先にCOPYしてからnpm系を実行⚡
  1. イメージが太い🐘
  • ✅ 無駄ファイルが入ってる / dev依存が残ってる
  • 👉 .dockerignorenpm prune --omit=dev を再確認🧹
  1. コンテナ停止が遅い/止まらない😱
  • ✅ PID1やシグナル周り
  • 👉 --init を付ける(まずこれ)🛟(docs.docker.jp)
  1. 「とりあえず動く」けど本番が怖い😨
  • ✅ タグが曖昧(latest) / 依存がブレる
  • 👉 バージョン指定(例:node:24-bookworm-slim)& lock を信じる🏷️(Snyk)

8) AIに頼むと強いところ🤖✨(そのまま投げてOK)

🧾 Dockerfileレビューお願い

  • 「このDockerfile、危険な点ムダ改善案を3つずつ教えて。初心者向けに理由も!」🧠

🪵 ログ解析お願い

  • 「このログを見て、原因候補トップ3と、確認コマンドを順番に出して」🔍

🧹 .dockerignore 提案

  • 「Node/TSのAPIで、Dockerビルドを速くしたい。.dockerignore のおすすめを“最小”で」⚡

9) ミニ課題(5〜15分)🎮✨

  1. 🧪 エントリファイルを間違えて起動失敗させて、ログから直す
  2. 🎛️ -e PORT=3000 を付けて、環境変数で動くことを確認
  3. 🏷️ タグを todo-api:1 にして、:dockerfile と並行管理してみる
  4. 🧹 .dockerignore を外してビルド→戻してビルド、速度差を体感⚡

10) 最終チェックリスト✅🏁

  • docker build -t todo-api:dockerfile . が通る🏗️
  • docker run --init -p 3000:3000 ... で起動できる🚀(docs.docker.jp)
  • docker logs -f で動いてるのが読める🪵
  • docker stopdocker rm までできる🧹
  • .dockerignore が入ってる🧽
  • USER node でroot回避してる🔐
  • CMD ["node", ...] で “実行が分かりやすい” 状態になってる👍

おまけ:最短で雛形を作る方法(知っておくと便利)🧰✨

「自分で書ける」のが一番えらいんだけど、雛形が欲しい時は docker init で Dockerfile / compose / .dockerignore を自動生成もできるよ🤖📦(Docker公式ガイド)(Docker Documentation)


次の第51章からは「わざと壊して直す」デバッグ筋トレ編だね🏋️‍♂️🔥 もし今のTodo APIの エントリファイル名(distの中身) が標準と違うなら、この章のDockerfileを“あなたの構成に合わせた完成版”に寄せて最適化してあげるよ😆✨