WORKDIR 与 ENV 指令
WORKDIR 和 ENV 是 Dockerfile 中管理路径与环境的关键指令。
WORKDIR 指令
设置工作目录
dockerfile
# 设置工作目录
WORKDIR /app
# 后续指令在此目录下执行
COPY package.json ./
RUN npm install
COPY . .
# 可多次切换
WORKDIR /app
RUN pwd # /app
WORKDIR /src
RUN pwd # /src
WORKDIR /app/dist
RUN pwd # /app/dist
WORKDIR 可多次使用,后续指令(RUN、CMD、COPY、ADD、ENTRYPOINT)在该目录下执行。
路径规则
dockerfile
# 绝对路径
WORKDIR /app
# 相对路径(基于上一级 WORKDIR)
WORKDIR src # 实际为 /app/src
# 引用环境变量
WORKDIR $APP_HOME
避免使用 RUN cd
dockerfile
# 错误做法(RUN 不影响后续指令)
RUN cd /app
RUN npm install # 不在 /app 目录下
# 正确做法
WORKDIR /app
RUN npm install
ENV 指令
设置环境变量
dockerfile
# 单行设置
ENV NODE_ENV=production
# 多行设置
ENV APP_HOME=/app \
PORT=3000 \
DB_HOST=localhost
# 使用变量
ENV APP_HOME=/app
WORKDIR $APP_HOME
COPY . $APP_HOME/src
环境变量作用域
dockerfile
# 构建时可用
ENV VERSION=1.0
RUN echo "Building version $VERSION"
# 运行时可用
ENV PORT=3000
CMD ["node", "server.js"] # 进程可读取 PORT 环境变量
查看环境变量
Bash
# 构建后查看
docker inspect my-image | grep -A 10 "Env"
# 运行时查看
docker exec my-container env
# 运行时修改
docker run -e NEW_VAR=value my-image
状态传递
dockerfile
# WORKDIR 状态传递
WORKDIR /app # 设置 /app
COPY . . # 拷贝到 /app
RUN npm install # 在 /app 执行
# ENV 状态传递
ENV NODE_ENV=production
ENV PORT=3000
# 后续指令均可引用
EXPOSE $PORT
CMD ["node", "server.js"]
实用示例
dockerfile
FROM node:18-alpine
# 环境变量
ENV APP_HOME=/app \
NODE_ENV=production \
PORT=3000
# 工作目录
WORKDIR $APP_HOME
# 安装依赖
COPY package*.json ./
RUN npm ci --only=production
# 拷贝代码
COPY . .
# 暴露端口
EXPOSE $PORT
# 启动
CMD ["node", "server.js"]
要点总结
- WORKDIR 设置工作目录,影响后续所有指令的执行路径
- 避免使用 RUN cd,应使用 WORKDIR 切换目录
- ENV 设置环境变量,构建和运行时均可访问
- 环境变量可在后续指令中引用($VAR 或 ${VAR})
- WORKDIR 和 ENV 状态在 Dockerfile 中逐行传递
📝 发现内容有误?点击此处直接编辑