ENTRYPOINT与CMD组合的核心逻辑是ENTRYPOINT定义启动程序,CMD提供默认参数并追加其后;必须用JSON数组的exec格式,否则shell格式会绕过ENTRYPOINT导致CMD被忽略。

ENTRYPOINT与CMD组合的核心逻辑
ENTRYPOINT定义容器启动时的可执行程序,CMD提供默认参数;两者结合时,CMD内容会作为参数追加到ENTRYPOINT命令之后。这种设计让镜像既可直接运行,又能灵活覆盖参数。
推荐写法:使用exec格式避免shell陷阱
务必采用JSON数组格式(exec格式),而非字符串格式(shell格式)。shell格式会绕过ENTRYPOINT,导致CMD被忽略或行为异常。
-
正确写法(exec格式):ENTRYPOINT ["nginx", "-g"]
CMD ["daemon off;"] -
错误写法(shell格式):ENTRYPOINT nginx -g
CMD daemon off; → CMD会被完全忽略 - exec格式下,docker run my-nginx "xxx" 会执行 nginx -g "xxx",而非覆盖整个命令
实现“可执行镜像”:让镜像像二进制一样用
将ENTRYPOINT设为脚本或主程序,CMD作为默认入参,用户可通过docker run直接传参调用,无需记完整命令。
- 例如构建一个curl工具镜像:
ENTRYPOINT ["curl", "-s", "-f", "-L"]
CMD ["https://httpbin.org/get"] - 运行方式更自然:
docker run my-curl https://example.com → 实际执行 curl -s -f -L https://example.com - 不传参时自动访问默认URL,传参则精准替换CMD部分
覆盖与调试技巧:理解不同覆盖方式的行为差异
掌握如何在运行时安全覆盖——关键看是否指定--entrypoint。
- docker run my-img arg1 arg2 → 仅覆盖CMD,arg1/arg2追加到ENTRYPOINT后
- docker run --entrypoint /bin/sh my-img -c 'ls' → 完全替换ENTRYPOINT,CMD被丢弃
- 调试时常用:docker run --rm -it --entrypoint /bin/sh my-img 进入交互式shell










