首页/云/云与容器速查/Dockerfile WORKDIR 工作目录
容器与 Docker106 条

Dockerfile WORKDIR 工作目录

设置后续 RUN、CMD、ENTRYPOINT、COPY、ADD 的工作目录,不存在会自动创建。它同时决定容器运行时的默认 cwd,影响相对路径配置的解析。

云与容器速查云更新于 2026-10-13

Dockerfile WORKDIR 是什么

WORKDIR 设置后续 RUN、CMD、ENTRYPOINT、COPY、ADD 指令的工作目录,目录不存在时会自动创建,即使后续指令并没有真正用到它。它同时决定容器运行时的默认工作目录,因此应用用相对路径读取配置文件、写日志时,查找起点就是 WORKDIR。在排查容器内 no such file 类报错时,先确认 cwd 常常比反复检查路径更快。

基本信息

作用为后续构建指令与运行进程设定工作目录
自动创建目录不存在时自动创建(即使后续没用到)
相对路径相对上一个 WORKDIR 叠加,建议一律写绝对路径
与 RUN cdRUN cd 只影响当前那一层,不能替代 WORKDIR
运行时影响决定容器进程启动时的默认 cwd

典型使用场景

  • 设置应用根目录,让后续 COPY 与 RUN 不用重复写长路径
  • 让 CMD 里的相对路径命令能正确解析,例如 node server.js
  • 为多阶段构建的每个阶段设定独立工作目录,避免互相干扰
  • 把日志与临时文件的落点固定下来,便于挂载卷与排查
  • 配合非 root 用户运行,确保工作目录属主正确可写

标准写法

标准写法
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "server.js"]
# 运行时确认工作目录
docker run --rm myapp:1.0 pwd

常见写法与效果

写法效果建议
WORKDIR /app后续指令在 /app 下执行推荐,路径清晰
WORKDIR app(相对)相对上一个 WORKDIR 叠加多层时容易与直觉不符
RUN cd /app && make只在当前层生效,下一层回到原目录需要持久改变目录时用 WORKDIR
WORKDIR /data目录自动创建,可用于挂载点挂载卷后注意属主权限
应用读取相对路径的配置文件时,查找起点就是 WORKDIR,容器内报找不到文件先确认当前工作目录,再怀疑文件是否真的没打进镜像。
多层相对路径的 WORKDIR 会逐层叠加:写 WORKDIR a 再写 WORKDIR b,最终目录是 /a/b 而不是 /b,这与多数人的直觉相反,容易把文件写错位置。
多阶段构建里 WORKDIR 的作用范围只限当前阶段:每个 FROM 之后工作目录会重置为基础镜像的默认值,需要在该阶段内重新声明,否则后续指令会落在意料之外的位置。

易错点

  • 用 RUN cd /app && … 代替 WORKDIR:下一层又回到根目录,后续指令全部落错位置
  • 多层 WORKDIR 使用相对路径,路径逐层叠加,最后到达的位置与预期不符
  • 切换为非 root 用户运行前没有处理 WORKDIR 属主,容器启动即报无写权限
  • 为追求分层缓存把 WORKDIR 写在 COPY 之后,导致工作目录变化使缓存整体失效

数据来源与参考

  • Docker Docs:Dockerfile reference(WORKDIR)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌