首页/云/Kubernetes 速查/command 与 args 覆盖容器启动命令

command 与 args 覆盖容器启动命令

清单里的 command 覆盖镜像 ENTRYPOINT,args 覆盖 CMD;两者的组合矩阵决定容器最终执行什么,是定制镜像行为的常用手段。

Kubernetes 速查云更新于 2026-10-13

command 与 args 是什么

镜像用 ENTRYPOINT 定义入口程序、用 CMD 定义默认参数;Pod 清单里的 command 对应 ENTRYPOINT,args 对应 CMD,两者都写就完全接管容器的启动行为。容器运行时不做命令拼接,只做替换,所以可执行文件必须真实存在于镜像里,相对路径还依赖镜像的 PATH 与 WORKDIR。它是复用同一个镜像适配不同环境的常用手段。

基本信息

字段位置spec.containers[].command 与 spec.containers[].args
对应关系command 覆盖 ENTRYPOINT,args 覆盖 CMD
数据类型字符串数组,每个元素是一个独立参数,不是一整条命令行
都不写时沿用镜像自带的 ENTRYPOINT 与 CMD
平台归属Kubernetes 各类工作负载;Docker 侧对应 --entrypoint 与命令行参数

覆盖规则

commandargs最终执行
未设未设镜像 ENTRYPOINT + 镜像 CMD
未设设置了镜像 ENTRYPOINT + 清单里的 args
设置了未设只执行清单 command,镜像 CMD 被丢弃
设置了设置了清单 command 加清单 args,镜像默认值全部失效

完整写法

完整写法
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  template:
    spec:
      containers:
        - name: app
          image: registry.example.com/app:1.26.0
          command: ["/bin/sh", "-c"]        # 覆盖 ENTRYPOINT
          args: ["exec /app/server --config=/etc/app/config.yaml"]   # 覆盖 CMD
          env:
            - name: APP_ENV
              value: prod

只换参数不动入口

只换参数不动入口
# 镜像入口是 /app/server,这里只覆盖它的参数,最省事也最不容易出错
args: ["--config=/etc/app/config.yaml", "--log-level=info"]
# 不需要 shell 时优先写成这种形式,避免多一层 sh 带来的信号传递问题

典型使用场景

  • 同镜像跑不同参数:测试与生产用不同启动开关,不必为每套配置构建镜像
  • 注入启动外壳:用 /bin/sh -c 包一层做环境变量展开或等待依赖就绪
  • 临时排障:把 command 换成常驻空转命令让容器保持运行,便于进入查看(此时探针会失败,属预期)
  • 精简镜像适配:镜像里没有 shell 时直接执行二进制绝对路径,args 逐个列参数
  • 接管旧应用:镜像 CMD 里写死了参数,用 args 覆盖即可,不必重新打包
数组元素的边界就是参数的边界:写成 command: ["sh -c echo hi"] 时运行时会把整串当成一个可执行文件名去找,必然失败,正确写法是拆成 ["sh", "-c", "echo hi"]。
不确定镜像默认入口时,先用 kubectl get pod <pod> -o jsonpath='{.spec.containers[*].command}{"|"}{.spec.containers[*].args}' 看清单侧,再用 docker inspect 或镜像文档确认镜像侧的 ENTRYPOINT 与 CMD。启动失败通常表现为 CrashLoopBackOff,日志里出现 not found 字样。

易错点

  • 只写 command 却丢掉镜像 CMD 的默认参数:大量「参数丢失」类故障都源于此,动手前先确认镜像原始入口
  • 把一整条命令塞进一个数组元素:运行时按字面去查找可执行文件,容器必然起不来
  • shell 写法依赖镜像里有 /bin/sh:distroless 一类精简镜像必须直接执行二进制绝对路径
  • 把 command 换成常驻空转命令后忘记改回:业务失效但容器看起来一直在运行,探针与监控都会失真
  • 在 args 里指望变量展开:不经过 shell 时不会展开,需要 sh -c 包一层并注意引号层级
  • sh -c 写法下入口不是业务进程:信号与退出码由 shell 转发,可能影响优雅停止

数据来源与参考

  • Kubernetes 官方文档 · Pods(容器命令与参数)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌