Dockerfile CMD 的两种格式
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD command param1 param2 (shell form)
官方推荐 exec form
.
原因
shell form
时程序是通过 shell 执行, 导致程序运行时 pid 不是 1
!
kubernetes 在删除 pod 时会先发送信号 TERM
给 pod 的主进程(main process), 进程可以在收到信号后平滑(graceful)退出, 超时(30s)仍未退出的 pod 会被强制删除.
那么谁是 主进程(main process) ? 就是 pid 为 1
的进程!
也就是说如果 CMD 启动的进程 pid 不是 1
就无法正常收到 TERM
信号并退出, 最后会导致 pod 因超时被 k8s 强制删除.
所以, 赶紧改用 exec form
!