当前位置: 首页 > 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.jsqmd.com/news/911602/

相关文章:

  • 豆包推广时代,贵州企业怎么选GEO优化服务商?成立时间长、性价比高、口碑好的才靠谱 - 优质企业观察收录
  • 023、YOLOv6 EfficientRep 重参数化 backbone 原理解析与训练-部署两阶段策略
  • 深度解析黄金回收定价逻辑,乌鲁木齐黄金回收首选永盛黄金首饰店 - 企业推荐官【官方】
  • 论文被批“不够学术”?高校教授说用这几个AI写作辅助软件
  • WechatExporter深度解析:从iTunes备份到聊天记录导出的技术实现
  • 别再让白边毁了你的Matlab图!imagesc保存高清无白边图像的3种方法(附完整代码)
  • 英飞凌TC389平台下,AUTOSAR Fee模块的DaVinci配置避坑指南(附关键参数详解)
  • 扩散模型在机器人轨迹规划中的创新应用
  • 从零到一:物联网硬件开发全流程实战指南
  • 6-11 实现Shiro认证功能
  • ArcGIS Pro脚本工具实战:5分钟搞定‘修改要素别名’自动化(含PyCharm配置)
  • PS 怎么直接修改文字?3 种方法轻松改字
  • 3分钟掌握:B站缓存视频无损转换的智能方案
  • 2026论文隐藏级降AIGC工具大曝光:三步直降AIGC率至安全阈值!
  • Java开发者面试:从电商场景到微服务架构的深入探讨
  • xrdp远程连接Ubuntu花屏?可能是你的.xsession和startwm.sh在‘打架’
  • 如何用百度网盘API解决Python自动化文件管理难题
  • 树莓派摄像头实时视频流服务器搭建:Flask+PiCamera实战指南
  • 别再逐帧处理了!用PyTorch+MMSegmentation搞定视频语义分割的完整流程(附代码)
  • 手把手调参:解决IMU倾斜安装导致的车载组合导航漂移问题(附Python验证代码)
  • 避坑指南:在Linux服务器上为个人项目安装CUDA 11.1和cuDNN,如何避免污染系统目录?
  • Rust闭包与Lambda表达式:函数式编程入门
  • 给编程者的微积分课:用Python可视化理解函数连续、可导与洛必达法则
  • 别再死磕公式了!用Python+NumPy手把手实现机器人逆运动学数值求解(附避坑指南)
  • 保姆级教程:在 Qt 中为你的点云显示窗口添加鼠标交互(旋转/平移/缩放)与网格坐标轴
  • 3分钟上手Fooocus:零门槛AI绘画工具全解析
  • 别再手动画图了!用Graphviz+Python自动生成流程图,5分钟搞定复杂关系图
  • 基于ESP32与WS2812B的智能灯光系统:从FastLED编程到WLED部署实战
  • 杭州全屋定制哪家靠谱闭坑|2026 本地真实测评:莫干山全屋定制稳居榜首,品质家装闭眼选 - 商业新知
  • 【信息科学与工程学】计算机科学与自动化——第十篇 芯片设计24 芯片中的材料科学01