第九篇:《Dockerfile 指令精讲(二):WORKDIR、ENV、ARG、EXPOSE》 继续 Dockerfile 的学习。本文将讲解 WORKDIR、ENV、ARG、EXPOSE 这四个指令它们在设置工作目录、环境变量、构建参数和声明端口方面发挥着关键作用。掌握这些指令可以让你的 Dockerfile 更灵活、更安全、更易维护。一、WORKDIR设置工作目录语法dockerfileWORKDIR /path/to/dir作用为后续的 RUN、CMD、ENTRYPOINT、COPY、ADD 指令设置工作目录。如果目录不存在Docker 会自动创建。特性可以多次使用后续的相对路径会基于上一个 WORKDIR。支持环境变量引用如 WORKDIR $APP_HOME。示例dockerfileWORKDIR /appRUN pwd # 输出 /appWORKDIR srcRUN pwd # 输出 /app/srcWORKDIR /rootRUN pwd # 输出 /root最佳实践每个 Dockerfile 中至少使用一个 WORKDIR避免默认的根目录/导致文件混乱。建议使用绝对路径避免相对路径带来的歧义。将 WORKDIR 放在 COPY 之前以便使用相对路径复制文件。二、ENV设置环境变量语法dockerfileENVENV …作用设置环境变量在构建过程和容器运行时均可使用。特性变量值可以在后续指令中通过 $VARIABLE 或 ${VARIABLE} 引用。持久化到最终镜像中容器启动时也会包含这些变量。示例dockerfileENV NODE_VERSION18.17.0ENV APP_HOME/appWORKDIR $APP_HOMERUN echo $NODE_VERSION version.txt覆盖方式构建时可通过 --build-arg 覆盖 ENV但需要先定义 ARG。运行时可通过 docker run -e KEYvalue 覆盖。最佳实践将需要频繁修改的值如版本号定义为环境变量便于维护。避免在 ENV 中存储敏感信息密码、密钥因为镜像层可以被 docker history 查看。可使用 Docker Secret 或构建时传入 ARG 并多阶段清理。三、ARG构建参数语法dockerfileARG 变量名[默认值]作用定义构建时的变量仅在构建过程中有效不会保留在最终镜像中。与 ENV 的区别示例dockerfileARG VERSIONlatestFROM alpine:$VERSIONARG BUILD_DATERUN echo “Built on: $BUILD_DATE” /build-infoENV APP_VERSION$VERSION # 将 ARG 传递给 ENV构建时传递参数dockerbuild --build-argVERSION3.18--build-argBUILD_DATE$(date%Y-%m-%d)-tmyimage.最佳实践使用 ARG 定义可配置的版本号、基础镜像标签、代理设置等。敏感信息可通过 ARG 传入但请注意 --build-arg 的值会在构建历史中可见docker history多阶段构建可以清理。定义默认值使构建仍可无参运行。四、EXPOSE声明端口语法dockerfileEXPOSE [/…]作用声明容器运行时监听的端口主要用于文档目的和与编排工具如 Docker Compose的协作。它并不会实际发布端口。协议默认为 TCP可指定 /udp。可以多次 EXPOSE 或多个端口写在一行。示例dockerfileEXPOSE 80EXPOSE 443/tcpEXPOSE 53/udp与 -p 和 -P 的关系docker run -P随机映射所有 EXPOSE 的端口到宿主机。docker run -p 8080:80手动映射端口无论是否 EXPOSE 都可以。最佳实践显式声明应用监听的端口方便协作和自动化工具如 Kubernetes 识别端口。即使不使用 -P建议仍写 EXPOSE 作为文档。五、综合示例结合多个指令dockerfile构建参数ARG BASE_IMAGEnode:18-alpineARG APP_HOME/appFROM $BASE_IMAGE设置环境变量持久化ENV NODE_ENVproductionAPP_HOME${APP_HOME}创建工作目录并切换WORKDIR $APP_HOME复制依赖文件并安装利用缓存COPY package*.json ./RUN npm ci --onlyproduction复制源代码COPY . .声明端口EXPOSE 3000运行命令CMD [“node”, “server.js”]构建并运行dockerbuild --build-argBASE_IMAGEnode:20-alpine-tmyapp.dockerrun-d-p3000:3000 myapp六、常见问题与解决七、小结WORKDIR 设置工作目录建议使用绝对路径。ENV 定义环境变量持久化到镜像和容器中。ARG 定义构建参数仅构建时有效适用于可配置的构建行为。EXPOSE 声明端口是文档和工具协作的好习惯。这些指令让 Dockerfile 更灵活、更清晰。结合上一讲的 FROM、RUN、COPY、ADD你已经可以编写复杂的生产级 Dockerfile。