当前位置: 首页 > news >正文

第九篇:《Dockerfile 指令精讲(二):WORKDIR、ENV、ARG、EXPOSE》

继续 Dockerfile 的学习。本文将讲解 WORKDIR、ENV、ARG、EXPOSE 这四个指令,它们在设置工作目录、环境变量、构建参数和声明端口方面发挥着关键作用。掌握这些指令可以让你的 Dockerfile 更灵活、更安全、更易维护。

一、WORKDIR:设置工作目录
语法:

dockerfile
WORKDIR /path/to/dir
作用:为后续的 RUN、CMD、ENTRYPOINT、COPY、ADD 指令设置工作目录。如果目录不存在,Docker 会自动创建。

特性:

可以多次使用,后续的相对路径会基于上一个 WORKDIR。

支持环境变量引用(如 WORKDIR $APP_HOME)。

示例:

dockerfile
WORKDIR /app
RUN pwd # 输出 /app
WORKDIR src
RUN pwd # 输出 /app/src
WORKDIR /root
RUN pwd # 输出 /root
最佳实践:

每个 Dockerfile 中至少使用一个 WORKDIR,避免默认的根目录(/)导致文件混乱。

建议使用绝对路径,避免相对路径带来的歧义。

将 WORKDIR 放在 COPY 之前,以便使用相对路径复制文件。

二、ENV:设置环境变量
语法:

dockerfile
ENV
ENV = = …
作用:设置环境变量,在构建过程和容器运行时均可使用。

特性:

变量值可以在后续指令中通过 $VARIABLE 或 ${VARIABLE} 引用。

持久化到最终镜像中,容器启动时也会包含这些变量。

示例:

dockerfile
ENV NODE_VERSION=18.17.0
ENV APP_HOME=/app
WORKDIR $APP_HOME
RUN echo $NODE_VERSION > version.txt
覆盖方式:

构建时可通过 --build-arg 覆盖 ENV(但需要先定义 ARG)。

运行时可通过 docker run -e KEY=value 覆盖。

最佳实践:

将需要频繁修改的值(如版本号)定义为环境变量,便于维护。

避免在 ENV 中存储敏感信息(密码、密钥),因为镜像层可以被 docker history 查看。可使用 Docker Secret 或构建时传入 ARG 并多阶段清理。

三、ARG:构建参数
语法:

dockerfile
ARG <变量名>[=<默认值>]
作用:定义构建时的变量,仅在构建过程中有效,不会保留在最终镜像中。

与 ENV 的区别:

示例:

dockerfile
ARG VERSION=latest
FROM alpine:$VERSION

ARG BUILD_DATE
RUN echo “Built on: $BUILD_DATE” > /build-info

ENV APP_VERSION=$VERSION # 将 ARG 传递给 ENV
构建时传递参数:

dockerbuild --build-argVERSION=3.18--build-argBUILD_DATE=$(date+%Y-%m-%d)-tmyimage.

最佳实践:

使用 ARG 定义可配置的版本号、基础镜像标签、代理设置等。

敏感信息可通过 ARG 传入,但请注意 --build-arg 的值会在构建历史中可见(docker history),多阶段构建可以清理。

定义默认值,使构建仍可无参运行。

四、EXPOSE:声明端口
语法:

dockerfile
EXPOSE [/…]
作用:声明容器运行时监听的端口,主要用于文档目的和与编排工具(如 Docker Compose)的协作。它并不会实际发布端口。

协议默认为 TCP,可指定 /udp。

可以多次 EXPOSE 或多个端口写在一行。

示例:

dockerfile
EXPOSE 80
EXPOSE 443/tcp
EXPOSE 53/udp
与 -p 和 -P 的关系:

docker run -P:随机映射所有 EXPOSE 的端口到宿主机。

docker run -p 8080:80:手动映射端口,无论是否 EXPOSE 都可以。

最佳实践:

显式声明应用监听的端口,方便协作和自动化工具(如 Kubernetes 识别端口)。

即使不使用 -P,建议仍写 EXPOSE 作为文档。

五、综合示例:结合多个指令
dockerfile

构建参数

ARG BASE_IMAGE=node:18-alpine
ARG APP_HOME=/app

FROM $BASE_IMAGE

设置环境变量(持久化)

ENV NODE_ENV=production
APP_HOME=${APP_HOME}

创建工作目录并切换

WORKDIR $APP_HOME

复制依赖文件并安装(利用缓存)

COPY package*.json ./
RUN npm ci --only=production

复制源代码

COPY . .

声明端口

EXPOSE 3000

运行命令

CMD [“node”, “server.js”]
构建并运行:

dockerbuild --build-argBASE_IMAGE=node:20-alpine-tmyapp.dockerrun-d-p3000:3000 myapp

六、常见问题与解决

七、小结
WORKDIR 设置工作目录,建议使用绝对路径。

ENV 定义环境变量,持久化到镜像和容器中。

ARG 定义构建参数,仅构建时有效,适用于可配置的构建行为。

EXPOSE 声明端口,是文档和工具协作的好习惯。

这些指令让 Dockerfile 更灵活、更清晰。结合上一讲的 FROM、RUN、COPY、ADD,你已经可以编写复杂的生产级 Dockerfile。

http://www.rkmt.cn/news/1422909.html

相关文章:

  • 深度解析黄金回收定价逻辑,乌鲁木齐黄金回收首选永盛黄金首饰店 - 企业推荐官【官方】
  • 023、YOLOv6 EfficientRep 重参数化 backbone 原理解析与训练-部署两阶段策略
  • WechatExporter深度解析:从iTunes备份到聊天记录导出的技术实现
  • 论文被批“不够学术”?高校教授说用这几个AI写作辅助软件
  • 3分钟掌握:B站缓存视频无损转换的智能方案
  • 2026论文隐藏级降AIGC工具大曝光:三步直降AIGC率至安全阈值!
  • Java开发者面试:从电商场景到微服务架构的深入探讨
  • 树莓派摄像头实时视频流服务器搭建:Flask+PiCamera实战指南
  • 手把手调参:解决IMU倾斜安装导致的车载组合导航漂移问题(附Python验证代码)
  • 给编程者的微积分课:用Python可视化理解函数连续、可导与洛必达法则
  • 保姆级教程:在 Qt 中为你的点云显示窗口添加鼠标交互(旋转/平移/缩放)与网格坐标轴
  • 别再手动画图了!用Graphviz+Python自动生成流程图,5分钟搞定复杂关系图
  • 土壤尿液电池:微功率物联网的可持续能源解决方案
  • 保姆级教程:用HFSS 2023 R2设计24GHz微带雷达天线(从单元到阵列,附模型文件)
  • Mac用户福音:在Parallels Desktop里跑VMware虚拟机,保姆级避坑指南(解决VT-x/Device Guard报错)
  • 电商行业的 AI Agent Harness Engineering:从智能导购到库存管理
  • 终极Markdown浏览器扩展:3分钟让你的Chrome变身专业文档阅读器
  • Windows下源码编译Open3D,我踩过的那些坑(附保姆级避坑指南)
  • SCMP考试难不难?2026年备考难度分析和通过策略 - 众智商学院职业教育
  • 教育博主深度调研:涵盖近年考点的临床执医技能题库怎么选? - 医考机构品牌测评专家
  • 铁皮保温施工步骤及施工团队推荐 - 品牌推荐大师
  • AI Agent的长期目标与任务分解:HuggingGPT项目架构深度解析
  • Vibe Coding 这个概念真的香吗?我试了一周后蚌埠住了
  • 如何永久保存微信聊天记录?3步实现数据自由与智能分析
  • 2026徐州黄金回收店哪家好?本地7家正规商家实测排名(附今日金价及避坑指南) - 宁波早知道
  • 上海执行案件哪个律师事务所专业?行业权威评级榜单发布 - 品牌2026
  • D2DX技术解析:如何让《暗黑破坏神2》在现代PC上重获新生
  • 新手装机全攻略:从硬件兼容到点亮调试,避坑指南与实操详解
  • OGSM战略落地指南:从“一页纸蓝图”到“全员行动”
  • 保姆级教程:用Ubuntu 18.04和Asterisk把家里电信固话“搬”到手机上(附光猫配置避坑点)