describe 或 kubelet 日志中没有明确记录错误原因时,基本都是因为 command 命令不合法导致的。

命令和参数说明

commandargs 分别对应于 Dockerfile 中的 ENTRYPOINTCMDcommand 表示要执行的命令,args 是传递给该命令的参数。

  • 如果 commandargs 均未填写,则使用 Dockerfile 中的配置。
  • 如果填写了 command 但未填写 args,则 Dockerfile 默认配置会被忽略,执行输入的 command(不带任何参数,当然 command 中可自带参数)。
  • 如果未填写 command 但填写了 args,则 Dockerfile 中配置的 ENTRYPOINT 命令行会被执行,并将 args 中填写的参数追加到 ENTRYPOINT 中。
  • 如果 commandargs 都填写了,则 Dockerfile 的配置被忽略,执行 command 并追加上 args 参数。例如:
    • command: /test.sh,p1,p2
    • args: p3,p4

关于 CMDENTRYPOINT 还有一点需要特别注意:如果一个 Dockerfile 中有多个 CMDENTRYPOINT,只有最后一个会生效,前面其他的都会被覆盖。

多条命令执行

Kubernetes 中,command 指令不允许直接执行多条命令。如果需要执行多条指令,可参照如下写法。

写法1

1
2
3
4
5
6
7
8
9
- command:
- /bin/sh
- -c
- |
echo hello &&
i=0 &&
while ((i<5)); do echo hello${i}; i=$((i+1)); done

# 然后不要添加 args

写法2(args 类似写 shell)

1
2
3
4
5
6
7
8
9
10
command: ["/bin/sh", "-c"]
args:
- |
echo hello
i=0
while ((i<5))
do
echo hello${i}
i=$((i+1))
done