entrypoint与cmd组合使用需坚持exec格式:entrypoint["./entrypoint.sh"]+cmd["app:start"]才能正确传参;入口脚本须用#!/bin/sh -e开头,前置逻辑后执行exec "$@"以接管pid 1并透传参数。

ENTRYPOINT 和 CMD 组合使用,核心是让容器既健壮又灵活:ENTRYPOINT 固定执行框架(比如环境检查、配置生成、依赖等待),CMD 只管传具体行为(如服务名、端口、模式)。关键不在“能不能用”,而在“怎么写才不出错”。
必须用 exec 格式,否则 CMD 会被忽略
两种写法效果天差地别:
-
正确(exec 格式):ENTRYPOINT ["./entrypoint.sh"] + CMD ["app:start"] → 启动时执行
./entrypoint.sh app:start -
错误(shell 格式):ENTRYPOINT ./entrypoint.sh + CMD ["app:start"] → CMD 完全不生效,只跑
/bin/sh -c ./entrypoint.sh
shell 格式会绕过参数传递机制,CMD 内容无法作为参数追加。所有场景下,都应坚持 JSON 数组写法。
入口脚本要能透传参数并保持 PID 1
entrypoint.sh 是组合逻辑的中枢,需满足三点:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 开头加
#!/bin/sh -e,确保任一命令失败立即退出 - 前置逻辑做完后,用
exec "$@"启动主进程(不是"$@"或sh -c "$@") - 避免漏掉
exec——它让主进程接管 PID 1,才能正确接收 SIGTERM 等信号
例如脚本末尾写 exec "$@",运行 docker run myimg --port 9000 就等价于执行 ./entrypoint.sh --port 9000,再由 exec 转交。
支持调试的关键设计
生产需要守门,开发需要绕过。在 entrypoint.sh 里留出调试入口:
- 识别特殊参数:遇到
--shell就直接exec /bin/sh - 用简单条件剥离控制参数:
if [ "$1" = "--skip-wait" ]; then shift; fi,再exec "$@" - 保留终极兜底:
docker run --rm -it --entrypoint /bin/sh myimg,完全跳过脚本
常见覆盖行为要心里有数
运行时不同写法,结果差异明显:
-
docker run myimg arg1 arg2→ CMD 被替换,执行./entrypoint.sh arg1 arg2 -
docker run --entrypoint /bin/sh myimg -c 'ls'→ ENTRYPOINT 被强制替换,CMD 彻底丢弃 -
docker run myimg(不带参数)→ 执行./entrypoint.sh app:start(即 CMD 内容)
不需要记规则,只需记住:CMD 是默认参数,不是默认命令;ENTRYPOINT 是锚点,不是装饰。










