workdir 必须使用绝对路径(如 /app),它自动创建目录并作为后续所有指令的执行基准,避免路径混乱和构建失败;相对路径写法(如 workdir app)会导致构建失败。

直接用 WORKDIR 指令设置一个明确的绝对路径,就能让后续所有指令(RUN、COPY、CMD、ENTRYPOINT)默认在这个目录下执行,省去反复写完整路径或用 RUN cd ... 切换的麻烦。
必须用绝对路径,别写相对路径
WORKDIR 只接受绝对路径,比如 /app、/srv/my-service。它会自动创建该目录(如果不存在),并设为后续操作的基准点。
- ✅ 正确写法:
WORKDIR /app - ❌ 错误写法:
WORKDIR app(会被当作相对路径,但 Docker 不允许,构建会失败) - ⚠️ 注意:虽然语法支持链式相对路径(如
WORKDIR /a && WORKDIR b→ 实际是/a/b),但容易出错,不推荐在生产 Dockerfile 中使用
选一个语义清晰、稳定不变的路径
别用临时目录(如 /tmp)或系统路径(如 /var/app),它们权限混乱、含义模糊、易被覆盖。优先选带业务含义的路径:
-
/app:通用、简洁,适合大多数微服务 -
/srv/myapp:强调服务归属,适合多服务共存场景 - 可结合 ENV 提前定义:
ENV APP_HOME=/opt/myapp && WORKDIR $APP_HOME
配合目录结构设计,真正简化运维
WORKDIR 是整个容器内路径规范的“锚点”。以它为起点,按职责划分子目录,后续 COPY、日志输出、挂载都更直观:
-
COPY . .就是把代码复制到/app下,不用写COPY . /app -
RUN npm install自动在/app执行,依赖装在正确位置 -
ENTRYPOINT ["./start.sh"]默认从/app启动脚本 - 运行时挂载配置:
docker run -v ./config:/app/config,路径语义一目了然
运行和调试时也能继承这个路径
容器启动后,docker exec container_name pwd 默认显示的就是 WORKDIR 路径。调试时不用再 cd /app,直接操作文件或日志更顺手。
- 如需临时切换,可用
docker exec -w /app/logs container_name tail -f app.log - 若想覆盖默认路径,
docker run -w /data优先级更高,但日常建议保持一致











