标准答案

  1. RUN 用于安装依赖、生成文件或编译制品,执行结果写入镜像构建层。
  2. CMD 提供默认命令或默认参数,运行容器时可以被命令行覆盖。
  3. ENTRYPOINT 定义主要执行程序,通常用于固定容器职责;配合 CMD 提供默认参数更容易复用。
  4. 生产镜像应让主进程前台运行,明确信号和退出码,不要把服务藏在 shell 后台进程中。

题目解析

RUN 在 build 阶段执行并生成镜像层;CMD 和 ENTRYPOINT 在 container 启动时定义默认进程和参数。CMD 容易被运行命令覆盖,ENTRYPOINT 更适合固定程序入口,两者组合时还要理解参数拼接规则。

exec form 直接执行目标程序,参数边界和信号通常更清晰;shell form 会经过 shell 解析,可能改变变量、通配符和信号行为。启动脚本若承担初始化,应在完成设置后用 exec 把 PID 1 替换为应用,否则 stop、退出码和子进程回收都可能失真。

常见误区

  • 误区:把 CMD 当成构建命令。改正:RUN 属于构建阶段,CMD/ENTRYPOINT 属于运行时入口。
  • 误区:脚本启动应用后不 exec。改正:用 exec 传递 PID 1 的信号和退出码,或使用明确的 init。
  • 误区:容器进程退出后还期待服务继续运行。改正:确保前台主进程持续运行,后台任务交给独立的 supervisor 或任务系统。

作者信息