RUN在构建时执行并固化为镜像层;CMD提供可被覆盖的默认启动命令;ENTRYPOINT定义不可替代的强制入口,参数可追加。三者分属构建期与运行期,决定镜像结构与容器行为。

理解 RUN、CMD 和 ENTRYPOINT 的关键,在于它们各自所处的容器生命周期阶段:构建期 vs 运行期,以及命令是否可被覆盖。这三层差异直接决定了镜像怎么建、容器怎么启、行为怎么定制。
RUN:只在镜像构建时执行,固化为镜像层
RUN 指令运行在 docker build 阶段,每条 RUN 都会启动一个临时容器,执行命令(如安装软件、复制配置),然后把变更保存为一个新的只读镜像层。它不会出现在容器运行时,也不会影响启动逻辑。
- 执行时机固定:仅 build 时运行一次,之后永不重复
- 结果持久化:生成的文件、环境、二进制都成为镜像的一部分
- 影响镜像大小:每个 RUN 创建新层,频繁或低效的 RUN 会显著增大镜像体积
- 示例:
RUN apt-get update && apt-get install -y curl→ curl 被装进镜像,后续容器天然可用
CMD:运行时默认命令,但极易被覆盖
CMD 定义的是容器启动时的 默认行为,但它本质是一个“可被替换的建议”。只要你在 docker run 后面加了命令(哪怕只是 bash),CMD 就完全失效。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 执行时机:容器
docker run启动时,且仅当未指定其他命令才生效 - 覆盖规则明确:
docker run nginx:latest sh→ 忽略 CMD,执行sh - 多 CMD 只留最后一个:Dockerfile 中写多个 CMD,只有最后一行起作用
- 典型用途:给调试型镜像设个友好入口,比如
CMD ["sh"]或CMD ["python", "app.py"]
ENTRYPOINT:运行时强制入口,参数可追加不可替代
ENTRYPOINT 是容器真正的“程序入口”,它定义了容器必须执行的核心命令。它不会被 docker run 后的命令替换,而是把那些命令当作自己的参数来接收。
- 执行机制:无论你
docker run myimg arg1 arg2还是docker run myimg --help,ENTRYPOINT 命令都会先跑,后面参数自动拼接过去 - 与 CMD 协同:若同时存在
ENTRYPOINT ["nginx"]和CMD ["-g", "daemon off;"],最终执行的是nginx -g "daemon off;" - 不可绕过:除非显式用
--entrypoint=/bin/sh覆盖,否则 ENTRYPOINT 总是第一道执行指令 - 适用场景:封装工具类镜像(如
curl、jq、ffmpeg),确保每次运行都是该程序本身
不复杂但容易忽略:RUN 是“做菜时备料”,CMD 是“菜单上写的推荐主食”,ENTRYPOINT 是“厨房里那口必须开火的灶台”。选对指令,才能让镜像既轻量又可控,既可调试又可复用。

















