导航菜单

Dockerfile 指令详解

陆兴东 2026-06-04 9 浏览 Docker

构建阶段指令(镜像构建时执行)

指令
功能
关键特性
FROM
指定基础镜像
FROM scratch 表示空白镜像;每个 Dockerfile 必须以 FROM 开头
RUN
执行 Shell 命令
每条 RUN 产生一层,应尽量用 && 合并命令减少层数
COPY
复制本地文件/目录到镜像
不自动解压 tar.gz
ADD
复制本地文件/目录到镜像
自动解压 tar.gz;具备远程 URL 下载能力(不推荐用于远程)
LABEL
添加镜像元数据
记录作者、版本、创建时间等
ENV
设置环境变量
全局有效,后续所有指令均可引用
WORKDIR
切换工作目录
等同于 cd,但切换后的目录在容器运行时仍然有效
USER
切换用户
等同于 su,切换后的用户在容器运行时仍然有效

ENV vs RUN 变量:ENV 定义全局变量,整个 Dockerfile 可用;RUN 中定义的变量(如 VAR=value)仅当前 RUN 层有效。

运行时指令(容器启动时生效)

指令
功能
关键特性
CMD
设置容器默认启动命令
可被 docker run 后的命令覆盖;一个 Dockerfile 中只能生效一次
ENTRYPOINT
设置容器必定执行的命令
不可被覆盖,总是优先执行;若与 CMD 共存,CMD 内容会作为参数传入
EXPOSE
声明监听端口
只有声明后,启动容器时才能使用 -P 自动映射
VOLUME
声明数据卷目录
提示使用者该目录需要挂载持久化存储
HEALTHCHECK
健康检查
定时检测容器内进程状态

CMD 的四种写法对比

# 方式 1:Shell 形式(默认调用 /bin/sh -c)
CMD nginx -g "daemon off;"

# 方式 2:Exec 形式(推荐,但注意单字符串问题)
CMD ["nginx -g 'daemon off;'"]      # 错误,会被当作一个整体命令找不到

# 方式 3:Exec 形式(正确,参数分离)
CMD ["nginx", "-g", "daemon off;"]  # 推荐

# 方式 4:显式指定 Shell 执行(让 Shell 作为 PID 1)
CMD ["/bin/sh", "-c", "nginx -g 'daemon off;'"]

HEALTHCHECK 示例

HEALTHCHECK --interval=5s --retries=3 --timeout=3s \
  CMD curl -fs http://localhost/ || exit 1
参数
含义
--interval
检查周期
--retries
失败重试次数
--timeout
单次检查超时时间

ENTRYPOINT 与 CMD 协作模式

ENTRYPOINT ["/entrypoint.sh"]       # 必定执行初始化脚本
CMD ["nginx", "-g", "daemon off;"] # 作为参数传入 entrypoint.sh
  • ENTRYPOINT 常用于启动应用前的初始化操作(如配置渲染、权限修正)
  • 脚本最后一行必须是 exec "$@" 以处理传入的参数