WORKDIR 指令用于在 Dockerfile 中设置镜像的默认工作目录,必须使用绝对路径,可多次声明(后一次覆盖前一次),Docker 会自动创建不存在的目录,且影响后续 RUN、COPY、CMD 等指令的执行路径。

创建带有工作目录的 Docker 容器,核心在于在构建镜像时通过 WORKDIR 指令设定默认工作路径,而非在运行容器时临时指定。Docker 容器启动后自动进入该目录,后续执行命令(如 CMD、RUN 或交互式 shell)都以此为基准。
H3 工作目录怎么在镜像中设置
WORKDIR 是 Dockerfile 中的关键指令,用于声明容器内所有后续指令(RUN、COPY、CMD、ENTRYPOINT)的默认执行路径。
- 必须使用绝对路径(如
/app、/usr/src/myapp),不能是相对路径 - 可多次使用,后一次会覆盖前一次(但不推荐频繁切换)
- 如果目录不存在,Docker 会自动创建(包括中间父目录)
示例:
FROM python:3.9-slim WORKDIR /app # 创建并进入 /app 目录 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "main.py"]
构建后,容器启动时 python main.py 就是在 /app 下执行的。
H3 运行容器时还能改工作目录吗
可以,但仅限单次覆盖,不改变镜像本身:
-
使用
docker run -w参数指定运行时工作目录docker run -w /tmp my-python-app pwd # 输出:/tmp
若镜像中已设
WORKDIR /app,但你加了-w /data,则容器启动后实际工作目录是/data,CMD也会在此路径下执行(除非 CMD 写了绝对路径)
⚠️ 注意:-w 不影响 COPY 或 RUN 行为(那些只发生在构建阶段),它只作用于容器运行时的初始工作路径。
H3 常见误区和建议
不要依赖
cd命令来切换工作目录RUN cd /app && python app.py是无效的——每条RUN启动新 shell,cd效果不会延续到下一条指令。必须用WORKDIR。避免把
WORKDIR写成/或/root等系统关键路径
推荐使用应用专属路径,如/app、/srv/myapp,语义清晰且安全。多阶段构建中,每个
FROM后的WORKDIR是独立的
第一阶段设WORKDIR /src,第二阶段设WORKDIR /app,两者互不影响。检查是否生效的小技巧
启动容器后执行docker exec -it <container> pwd,看输出是否为你期望的路径。
H3 构建并验证工作目录
- 编写含
WORKDIR的 Dockerfile(如上例) - 构建镜像:
docker build -t myapp .
- 运行并查看工作目录:
docker run --rm myapp pwd # 应输出:/app
不复杂但容易忽略


















