メインコンテンツまでスキップ

第43章:WORKDIR(迷子防止)🧭

この章はひとことで言うと、Dockerfile内での「作業場所(カレントディレクトリ)」を固定して、迷子をゼロにする章です😄✨ これが入るだけで、Dockerfileが一気に読みやすくなるし、ミスも減ります👍


🎯 この章のゴール

  • Dockerfileで WORKDIR を入れる意味が腹落ちする🙂
  • COPYRUNどこで実行されるかを説明できる🧠
  • Todo API の Dockerfile を WORKDIRあり版に改善できる💪

1) WORKDIRって何?🧭

WORKDIR は、Dockerfileの中での「いまいる場所(cdした先)」を決める命令です📍 これ以降の RUN / CMD / ENTRYPOINT / COPY / ADD は、基本的にこの場所を基準に動きます。(Docker Documentation)

さらに大事ポイント👇


2) WORKDIRがないと何が起きる?😵‍💫

WORKDIRがないと、Dockerfileは「今どこで作業してるの?」が行方不明になりがちです🌀

ありがちな事故👇

  • RUN npm ci をしたいのに、package.jsonがない場所で実行して失敗💥
  • COPY . . の意味が読み手に伝わらず、レビューが地獄😇
  • cd /app && ... を何回も書いて、コピペ事故が増える📎💣

3) まず結論:Node/TSの定番はこれ👌✨

Todo APIみたいなNode/TSアプリなら、まずはこれが超定番です👇(Nodeは例として LTS系を想定。2026年初頭のLTS系としてNode 24がActive LTS扱いになっています)(nodejs.org)

FROM node:24-bookworm-slim

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

CMD ["node", "dist/index.js"]

ポイントはこの3つだけ覚えればOK🧠✨

  • WORKDIR /app で作業場所固定📍
  • COPY package*.json ./npm ci でキャッシュ効きやすい⚡
  • COPY . . が「/appに全部入れる」になる📦

4) “あり/なし”で差を体験しよう🧪

❌ WORKDIRなし(迷子版)

FROM node:24-bookworm-slim

COPY package*.json /app/
RUN cd /app && npm ci

COPY . /app
RUN cd /app && npm run build

CMD ["node", "dist/index.js"]

一見動きそうだけど、cd忘れた瞬間に壊れるやつです😵 あと「/appってどこから来たの?」が散らばるので読みづらい📚💦

✅ WORKDIRあり(迷子ゼロ版)

FROM node:24-bookworm-slim

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

CMD ["node", "dist/index.js"]
  • ./.“/app基準” になるので超読みやすい😄
  • cdを書かない=ミスが減る💪✨

5) WORKDIRのルール(ここだけ押さえよう)📌

① WORKDIRは何に効く?🎯

RUN / CMD / ENTRYPOINT / COPY / ADD の基準になるよ、というルールです。(Docker Documentation)


② WORKDIRは何回でもOK(相対パスは積み上げ)🧱

例えばこう書くと👇

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

最終的に pwd/a/b/c になります(相対は前のWORKDIRからの相対)。(matsuand.github.io)


③ 相対WORKDIRだけで始めるのは危険⚠️

Dockerには WorkdirRelativePath というチェックがあって、**“絶対パスで始めずに相対WORKDIRを書くと危ないよ”**って警告してくれます。 理由は「ベースイメージ側の作業ディレクトリが変わると、意図しない場所に行く」からです。(Docker Documentation)

✅ 安全策:最初は必ず絶対パス

  • 例:WORKDIR /app(これでOK)

6) Todo API でハンズオン(差分だけでOK)🛠️✨

✅ ステップ1:Dockerfileをこう直す

前章までのDockerfileがどんな形でも、まずは “骨格” をこれに寄せるのが勝ちです🏆

FROM node:24-bookworm-slim

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

CMD ["node", "dist/index.js"]

✅ ステップ2:ビルド&起動(Todo APIを動かす)🚀

PowerShellでもOK👍

docker build -t todo-api:workdir .
docker run --rm -p 3000:3000 todo-api:workdir

✅ ステップ3:ほんとに /app が基準か確認🔍

起動コマンドを上書きして、中に入って見ます👀✨

docker run --rm -it --entrypoint sh todo-api:workdir
pwd
ls

pwd/app になってたら勝ち🎉


7) よくある落とし穴(初心者が踏むやつ)🪤😇

🪤 ① WORKDIRが作ったディレクトリの“所有者”問題(USERと絡む)

ちょっと先の章で USER を使って非root実行にすると、 WORKDIR が自動作成したディレクトリが root所有になって、書けなくて詰むことがあります😵‍💫 そのため「必要ならmkdir/chownを明示しよう」系の話が出ます。(GitHub)

(今は“そういう地雷がある”だけ知っておけばOK🙆)


🪤 ② マルチステージで COPY --from するときの罠(知識だけ)

別ステージからコピーするとき、**コピー元パスがWORKDIR基準じゃない(/基準っぽい挙動)**でハマる例が有名です。 困ったら「コピー元は絶対パスで書く」が安全寄りです🧯(GitHub)


🪤 ③ COPYの行き先がWORKDIR基準なのを忘れる

COPY test.txt relativeDir/ は、WORKDIR/app なら /app/relativeDir/ に入ります📦 この「相対パス=WORKDIR基準」が超重要です。(docs.docker.jp)


8) AI活用(レビュー用プロンプト例)🤖✨

VS CodeでCopilotやCodexに、こう投げると強いです💪

  • Dockerfileレビュー(迷子防止)🧭

    • 「このDockerfile、WORKDIRの使い方は適切? COPYRUN の基準ディレクトリが分かりにくい所があれば直して」
  • 事故防止チェック✅

    • 「WORKDIRを入れた前後で、挙動が変わる可能性がある箇所を列挙して」
  • “相対WORKDIR”検出🧨

    • 「相対WORKDIRが入ってたら危険度と修正案を出して」

9) 章末チェック(3問)📝😄

  1. WORKDIR /app の後の COPY . . はどこにコピーされる?📦
  2. WORKDIR b みたいな相対指定は、何を基準に解釈される?🧱
  3. 相対WORKDIRだけで始めるのが危ない理由は?⚠️

✅ この章のまとめ🎉

  • WORKDIR はDockerfileの “現在地固定” 📍
  • これがあると COPYRUN が読みやすくなってミスが減る😄
  • 最初は 絶対パスでWORKDIR、これだけは鉄板👌(Docker Documentation)

次の第44章(COPY)では、**「必要な物だけ運ぶ」+「.dockerignore」**でビルドを軽くしていきます📦🧹✨