7.10 WORKDIR 指定工作目錄
7.10.1 基本語法
WORKDIR <工作目錄路徑>
WORKDIR 指定後續指令的工作目錄。如果目錄不存在,Docker 會自動建立。
7.10.2 基本用法
WORKDIR /app
RUN pwd # 輸出 /app
RUN echo "hello" > world.txt # 建立 /app/world.txt
COPY . . # 複製到 /app/
7.10.3 為什麼需要 WORKDIR
常見錯誤
## ❌ 錯誤:cd 在下一個 RUN 中無效
RUN cd /app
RUN echo "hello" > world.txt # 檔案在根目錄!
原因分析
RUN cd /app
↓
啟動容器 → cd /app(僅記憶體變化)→ 送出映象層 → 容器銷燬
│
↓ 工作目錄未改變!
RUN echo "hello" > world.txt
↓
啟動新容器(工作目錄在 /)→ 建立 /world.txt
每個 RUN 都在新容器中執行,前一個 RUN 的記憶體狀態 (包括工作目錄) 不會保留。
正確做法
## ✅ 正確:使用 WORKDIR
WORKDIR /app
RUN echo "hello" > world.txt # 建立 /app/world.txt
7.10.4 相對路徑
WORKDIR 支援相對路徑,基於上一個 WORKDIR:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd # 輸出 /a/b/c
7.10.5 使用環境變數
ENV APP_HOME=/app
WORKDIR $APP_HOME
RUN pwd # 輸出 /app
7.10.6 多階段建立中的 WORKDIR
## 建立階段
## 建議使用 node:22 或 node: 等具體版本標籤,避免使用 latest
FROM node:22 AS builder
WORKDIR /build
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
## 生產階段
## 建議使用 nginx:alpine 或其他具體版本
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY --from=builder /build/dist .
7.10.7 最佳實踐
1. 儘早設定 WORKDIR
# 建議使用 node:22 等主/次版本號標籤
FROM node:22
WORKDIR /app # 儘早設定
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]
2. 使用絕對路徑
## ✅ 推薦:絕對路徑,意圖明確
WORKDIR /app
## ⚠️ 避免:相對路徑可能造成混淆
WORKDIR app
3. 不要用 RUN cd
## ❌ 避免
RUN cd /app && echo "hello" > world.txt
## ✅ 推薦
WORKDIR /app
RUN echo "hello" > world.txt
4. 適時重置 WORKDIR
WORKDIR /app
## ... 應用相關操作 ...
WORKDIR /data
## ... 資料相關操作 ...
...
7.10.8 與其他指令的關係
| 指令 | WORKDIR 的影響 |
|---|---|
RUN |
在 WORKDIR 中執行指令 |
CMD |
在 WORKDIR 中啟動 |
ENTRYPOINT |
在 WORKDIR 中啟動 |
COPY |
相對目標路徑基於 WORKDIR |
ADD |
相對目標路徑基於 WORKDIR |
WORKDIR /app
RUN pwd # /app
COPY . . # 複製到 /app
CMD ["./start.sh"] # /app/start.sh
7.10.9 執行時覆蓋
使用 -w 引數覆蓋工作目錄:
$ docker run -w /tmp myimage pwd
/tmp