镜像里写的是 ENTRYPOINT ["/app/server"] 和 CMD ["--port=8080"],docker run api:1.0 --debug 之后进程直接退出,日志里没有任何参数记录。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

docker run --rm api:1.0 --port=9090
docker inspect api:1.0 --format '{{json .Config.Entrypoint}} {{json .Config.Cmd}}'
docker run --rm api:1.0 --port=8080 --debug

docker run 后面跟的参数会整体替换 CMD,不会追加到 ENTRYPOINT 后面。只传一个 --debug,原来的 --port 就一起没了,端口参数缺失进程只能退出。这一点先确认清楚,后面就不用反复试。

碰到「ENTRYPOINT CMD 覆盖」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,把必填参数写进 ENTRYPOINT 只把可变的留给 CMD;运行时传参把 CMD 的内容一起带上 别只补一个;用 docker inspect 看最终的 Entrypoint 和 Cmd 拼出来是什么;需要排错时临时加 --entrypoint sh 进容器确认。

改完照着核一遍,启动日志里能看到 --port 和 --debug 同时生效,进程保持运行。

作者 9823189