第43章:WORKDIR(迷子防止)🧭
この章はひとことで言うと、Dockerfile内での「作業場所(カレントディレクトリ)」を固定して、迷子をゼロにする章です😄✨ これが入るだけで、Dockerfileが一気に読みやすくなるし、ミスも減ります👍
🎯 この章のゴール
- Dockerfileで WORKDIR を入れる意味が腹落ちする🙂
COPYやRUNが どこで実行されるかを説明できる🧠- Todo API の Dockerfile を WORKDIRあり版に改善できる💪
1) WORKDIRって何?🧭
WORKDIR は、Dockerfileの中での「いまいる場所(cdした先)」を決める命令です📍
これ以降の RUN / CMD / ENTRYPOINT / COPY / ADD は、基本的にこの場所を基準に動きます。(Docker Documentation)
さらに大事ポイント👇
- 指定したディレクトリが 存在しなければ作られます(勝手に作る)(Docker Documentation)
WORKDIRは 複数回書ける(積み重ねOK)(matsuand.github.io)
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の使い方は適切?
COPYとRUNの基準ディレクトリが分かりにくい所があれば直して」
- 「このDockerfile、WORKDIRの使い方は適切?
-
事故防止チェック✅
- 「WORKDIRを入れた前後で、挙動が変わる可能性がある箇所を列挙して」
-
“相対WORKDIR”検出🧨
- 「相対WORKDIRが入ってたら危険度と修正案を出して」
9) 章末チェック(3問)📝😄
WORKDIR /appの後のCOPY . .はどこにコピーされる?📦WORKDIR bみたいな相対指定は、何を基準に解釈される?🧱- 相対WORKDIRだけで始めるのが危ない理由は?⚠️
✅ この章のまとめ🎉
WORKDIRはDockerfileの “現在地固定” 📍- これがあると
COPYとRUNが読みやすくなってミスが減る😄 - 最初は 絶対パスでWORKDIR、これだけは鉄板👌(Docker Documentation)
次の第44章(COPY)では、**「必要な物だけ運ぶ」+「.dockerignore」**でビルドを軽くしていきます📦🧹✨