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

第 59 页,共 196 页
使用 mdPress 构建