WORKDIR 是什么
设定后续指令与容器启动进程的工作目录。目录不存在时会自动创建(含多级)。它解决的是相对路径的基准问题:不设定时每条指令都在根目录或基础镜像指定的目录执行,写出来的文件位置往往不是预期的。
基本信息
| 作用 | 设定构建期与运行期的初始工作目录 |
|---|---|
| 写法 | 可写绝对路径,也可写相对上一条的相对路径 |
| 自动创建 | 目录不存在时自动创建,含多级父目录 |
| 影响范围 | 其后的构建指令与容器启动进程都受影响 |
| 运行时覆盖 | 可在启动命令里指定工作目录覆盖镜像里的设定 |
典型使用场景
- 应用目录约定:把工作目录设为应用根目录,后续相对路径都基于它
- 分阶段构建:编译阶段与运行阶段各自设定目录,互不干扰
- 脚本执行基准:让启动脚本里的相对路径落在配置与数据目录预期位置
- 多服务镜像:不同服务目录分别设定,减少互相影响
- 排查路径问题:明确工作目录后,启动即报找不到文件的问题大幅减少
常用示例
常用示例
WORKDIR /app # 设定应用根目录,不存在会自动创建
COPY package.json ./ # 相对工作目录复制
RUN npm ci --omit=dev
COPY . .
WORKDIR /app/config # 再切一层目录
CMD ["node", "server.js"] # 启动进程的初始目录为最后设定的值
# docker run -w /app app/web:1.0 # 运行时覆盖常见路径问题与原因
| 现象 | 原因 | 处理 |
|---|---|---|
| 启动报找不到文件 | 相对路径基准与预期不符 | 显式设定工作目录并核对路径 |
| 产物写到意外的位置 | 构建期目录设定与启动期不一致 | 两个阶段都明确设定目录 |
| 临时切换目录无效 | 在单条指令里切换目录只对该条生效 | 改用专门的工作目录指令 |
| 目录层级与预期不符 | 多次使用相对路径彼此叠加 | 统一使用绝对路径 |
| 运行时被覆盖 | 启动参数里另设了工作目录 | 核对启动参数与镜像设定 |
设定目录的建议
- 统一使用绝对路径,避免相对路径彼此叠加造成意外层级
- 在工作目录设定之后再执行复制与安装,让路径语义一贯
- 需要切回上层目录时显式写完整路径,不要依赖相对回溯
- 运行阶段的工作目录要与启动命令、配置路径保持一致
- 涉及权限的目录在设定后确认属主,避免运行用户无法写入
在单条执行指令里切换目录只对那条命令生效,下一条又回到原来的位置。需要持续生效就必须用工作目录指令。
工作目录会影响容器启动进程看到的相对路径。启动脚本里用相对路径读配置的镜像,改动工作目录等于改变了配置查找位置。