ENTRYPOINT 是 Docker 中固定容器启动入口的指令,必须用 exec 格式(JSON 数组),使主程序 PID 为 1、支持信号和参数透传;CMD 在其存在时仅作为默认参数;复杂初始化应封装为入口脚本并以 exec "$@" 透传参数;可用 --entrypoint 临时覆盖。
entrypoint 是 docker 中用于固定容器启动入口的指令,它让镜像具备“可执行程序”的语义——无论怎么运行,核心命令始终不变,参数可灵活追加。
ENTRYPOINT 必须用 exec 格式
推荐写成 JSON 数组形式,例如:
ENTRYPOINT ["nginx", "-g"]ENTRYPOINT ["python3", "/app/main.py"]ENTRYPOINT ["./docker-entrypoint.sh"]
这种格式直接执行目标程序,PID 为 1,能正确接收 SIGTERM 等信号,支持参数透传。避免 shell 格式(如 ENTRYPOINT nginx -g),否则会绕过主进程、信号失效、CMD 参数被忽略。
ENTRYPOINT 和 CMD 配合使用
CMD 在 ENTRYPOINT 存在时不再独立执行,而是作为 ENTRYPOINT 的默认参数:
- Dockerfile 中写:
ENTRYPOINT ["echo", "Hello"]+CMD ["World"] -
docker run my-image→ 输出Hello World -
docker run my-image "Docker"→ 输出Hello Docker(CMD 被覆盖,新参数追加到 ENTRYPOINT 后)
需要初始化逻辑时封装入口脚本
复杂场景(如环境检查、配置生成、依赖等待)建议用 shell 脚本作为 ENTRYPOINT,但脚本本身仍要用 exec 格式调用:
- Dockerfile 中:
COPY entrypoint.sh /entrypoint.sh+RUN chmod +x /entrypoint.sh+ENTRYPOINT ["/entrypoint.sh"] - 脚本末尾必须写:
exec "$@",才能把 docker run 后的参数或 CMD 透传给真正主程序 - 这样既完成前置动作,又不破坏用户自定义命令的能力
运行时临时覆盖 ENTRYPOINT
调试或临时切换入口时,可用 --entrypoint 覆盖原设置:
-
docker run --entrypoint /bin/sh my-alpine-image→ 进入交互 shell -
docker run --entrypoint ls my-alpine-image /etc→ 列出目录内容 - 注意:该参数只影响单次运行,不修改镜像本身


















