多阶段构建通过分离构建与运行环境来精简镜像体积:前阶段用完整镜像编译打包,最后阶段仅复制必需产物到极简基础镜像(如-alpine或distroless),并清理缓存、合并RUN命令以减少层数。

多阶段构建减少镜像体积,核心是“只保留运行必需的东西”。它不是靠删文件凑数,而是从构建逻辑上切断冗余内容进入最终镜像的路径。
用不同阶段分离构建与运行环境
构建工具(如 npm、maven、go、gcc)和运行时完全不需要共存。多阶段构建让它们物理隔离:
- 前几个阶段用完整镜像(如
node:20、maven:3.8、golang:1.21)完成依赖安装、编译、打包 - 最后一个阶段换用极简镜像(如
node:20-alpine、openjdk:11-jre-slim、alpine:latest) - 只用
COPY --from=xxx把编译好的二进制、静态资源或node_modules复制过去,其余一概不带
选对基础镜像能直接砍掉几百 MB
基础镜像本身大小差异巨大,选错会抵消多阶段效果:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 避免
node:latest(约 1GB)、python:3.9(约 1.3GB)、ubuntu:latest(约 70MB+ 但含大量无用包) - 优先用
-slim版本:如python:3.9-slim(~110MB)、node:20-slim(~200MB),兼容性好、体积合理 - 追求极致时用
-alpine(如node:20-alpine~130MB)或distroless(如gcr.io/distroless/nodejs,无 shell,更安全) - 注意 Alpine 的 musl libc 兼容问题——Python 项目慎用,Go/Java/静态 Node 应用更适配
清理缓存和中间文件不能省略
即使分阶段,如果构建阶段没清理,残留仍可能污染最终镜像(尤其 COPY 整个目录时):
- npm 安装后加
&& npm cache clean --force - Debian/Ubuntu 系统中,apt 安装后加
&& rm -rf /var/lib/apt/lists/* - Go 编译建议设
CGO_ENABLED=0生成静态二进制,避免运行时依赖 glibc - Python 虚拟环境可建在 builder 阶段,只复制
venv/lib和venv/bin中实际需要的可执行文件
合并 RUN 命令减少镜像层数
每条 RUN 都新增一层,哪怕只是临时文件也会被保留。合并能压缩中间产物:
- 错:分开写
RUN apt update、RUN apt install curl、RUN rm -rf /var/lib/apt/lists/* - 对:合并为
RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/* - 这样所有操作在一个层内完成,临时文件不会残留为独立层

















