ENTRYPOINT 的核心作用是固定容器启动入口,确保主程序始终通过预设入口启动以避免跳过安全初始化;采用 shell 形式可执行权限降级、配置校验等加固操作;结合最小化基础镜像与多阶段构建提升安全性;关键安全逻辑严禁置于易被覆盖的 CMD 中。

ENTRYPOINT 的核心作用:固定容器启动入口
ENTRYPOINT 不是简单替代 CMD,而是为容器设定不可轻易覆盖的执行起点。它让镜像具备明确、一致的行为契约——无论用户如何运行容器(比如加参数或改命令),主程序始终通过预设入口启动,避免因误操作跳过安全初始化逻辑。
用 shell 形式 ENTRYPOINT 做启动前加固
采用 ENTRYPOINT ["sh", "-c"] 配合内联脚本,可在真正运行应用前完成权限降级、目录清理、配置校验等动作。例如:
ENTRYPOINT ["sh", "-c", "chown -R nobody:root /app && chmod -R 755 /app && exec su-exec nobody /app/server"]
- chown/chmod 确保运行时无写入敏感路径风险
- su-exec(轻量级 setuid 替代)以非 root 用户执行主进程,不依赖完整 sudo
- exec 替换当前 shell 进程,使主程序成为 PID 1,接收信号并正确处理退出
结合多阶段构建与最小化基础镜像
ENTRYPOINT 的安全性高度依赖底层环境。推荐做法:
- 使用
FROM gcr.io/distroless/static或FROM alpine:latest等精简镜像,移除包管理器、shell 甚至 libc 多余组件 - 在构建阶段编译或复制二进制,运行阶段只保留可执行文件和必要资源
- 若必须用 shell 功能,选择
alpine并显式删除/bin/sh外的其他解释器(如 bash、zsh)
禁止将敏感操作暴露给 CMD
CMD 容易被 docker run 后的参数覆盖,因此绝不能把权限控制、密钥加载、日志重定向等关键逻辑放在 CMD 中。正确模式是:
- ENTRYPOINT 固定为一个启动包装脚本(如
/usr/local/bin/entrypoint.sh) - CMD 仅传递应用级参数,如
["--port=8080", "--env=prod"] - entrypoint.sh 内部先完成所有加固步骤,再用
exec "$@"调用 CMD 参数

















