多阶段构建的核心是用多个FROM指令划分builder和runtime阶段,通过AS命名与--from复制仅将编译产物注入精简运行镜像,从源头隔离编译工具,实现体积缩减、安全增强与缓存优化。

多阶段构建的核心就是用多个 FROM 指令划分不同职责的阶段,只把编译产出复制到精简的运行镜像里——不是靠删文件,而是从一开始就不让编译工具进最终镜像。
明确划分两个阶段:builder 和 runtime
第一阶段(builder)负责装工具、拉依赖、编译打包;第二阶段(runtime)只带运行时必需的东西。关键在 AS 命名和 --from 复制:
- 用
FROM golang:1.21 AS builder或FROM python:3.11-build AS builder启动构建阶段 - 用
FROM alpine:latest或FROM python:3.11-slim-bookworm启动运行阶段 - 运行阶段中用
COPY --from=builder /app/dist/app.jar /app/这类指令拿产物,不复制源码、缓存、头文件或编译器
编译产物要放对位置,方便精准复制
别让构建结果散落在各处。统一输出到固定路径,比如 /app/out 或 /install,再整体复制过去:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- Go 项目可加
RUN CGO_ENABLED=0 go build -o /app/main .,确保静态链接 - Python 项目推荐
pip install --prefix=/install -r requirements.txt,然后COPY --from=builder /install /usr/local - Java Spring Boot 可先
RUN ./mvnw clean package -DskipTests,再COPY --from=builder /app/target/*.jar /app/app.jar
运行镜像越轻越好,但得能跑起来
选基础镜像不是越小越好,而是够用且安全。alpine 确实小,但 musl libc 可能引发兼容问题;slim 镜像更稳妥:
- 优先考虑
python:3.11-slim-bookworm而非alpine,避免 pip 包编译失败 - Go 静态二进制可直接用
FROM scratch,零依赖,体积最小 - 如果要用
scratch,务必确认程序无动态链接、无配置文件缺失、日志能输出到 stdout
验证是否真正分离成功
构建完别急着部署,先 inspect 镜像内容:
-
docker run --rm -it your-image ls /usr/bin | grep -E "gcc|make|g++|apt"—— 这些词不该出现 -
docker history your-image看各层大小,runtime 阶段应远小于 builder 阶段 -
docker run --rm -it your-image sh -c "python -c 'import sys; print(sys.path)'"确认 site-packages 路径合理,没混入构建路径

















