Files
docker_practice/07_dockerfile/7.10_workdir.md
T
yeasy ef2625531d style: 含中文的括号统一为全角(336 处 / 110 文件)
全书此前是真·五五开:含中文的括号 336 处半角 : 336 处全角,而且**在同一文件
内混用**——`18_security/18.1_kernel_ns.md` 第 11/17/20 行写 `(如 runC)`,
第 31 行写 `(用户命名空间映射)`。这不是体例问题,是它自己跟自己不一致。

集群里其余 13 本都一边倒(llm_internals 5 : 1049、oc_guide 2 : 713、
forward_deployed_engineering_guide 0 : 108),blockchain_guide 已在 2026-08-05
按同一方向统一过 97 处,故取全角,而非另立新规。全角括号前后不留空格,
原先 `概念 (镜像、容器、仓库) 和` 两侧的空格一并收掉。

**纯拉丁内容的半角括号一个没动**——`新建一个层 (Layer)`、`项目 (project)`
保持原样:改动前后「半角且内容纯拉丁」的数量都是 **1163**,而「半角且含中文」
从 **336 变成 0**。

其余验证:改动前后各自抹掉全部空白与圆括号后**逐字节相同**(两侧均 19559 字符);
左右括号总数改动前后都是 399 : 399,证明没有吞括号也没有配错对。
`check_project_rules` 202/202、`check_emphasis` 202/202、37 tests OK、
根 `format_checker` 与 `validate_codeblocks` 干净、`git diff --check` 干净。
2026-08-24 13:13:23 -07:00

3.0 KiB

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