Dockerfile WORKDIR 是什么
WORKDIR 设置后续 RUN、CMD、ENTRYPOINT、COPY、ADD 指令的工作目录,目录不存在时会自动创建,即使后续指令并没有真正用到它。它同时决定容器运行时的默认工作目录,因此应用用相对路径读取配置文件、写日志时,查找起点就是 WORKDIR。在排查容器内 no such file 类报错时,先确认 cwd 常常比反复检查路径更快。
基本信息
| 作用 | 为后续构建指令与运行进程设定工作目录 |
|---|---|
| 自动创建 | 目录不存在时自动创建(即使后续没用到) |
| 相对路径 | 相对上一个 WORKDIR 叠加,建议一律写绝对路径 |
| 与 RUN cd | RUN 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 之后工作目录会重置为基础镜像的默认值,需要在该阶段内重新声明,否则后续指令会落在意料之外的位置。