多阶段构建核心是职责分离:builder阶段安装编译工具并构建产物,runtime阶段仅复制必要文件至轻量镜像,通过copy --from精准传递、克制copy范围、合理利用缓存与.dockerignore,实现体积可控、安全高效。
多阶段构建不是加几个 from 就完事,关键在于分清“谁干活、谁上场”,让每阶段只做一件事,且产物干净可复用。高效模板的核心是职责分离、缓存友好、体积可控。
明确划分构建与运行阶段
至少设两个阶段:一个叫 builder(装编译工具和依赖),一个叫 runtime(只留运行所需)。不要混用镜像,比如别在生产阶段还用 python:3.11-slim-build。
- 第一阶段用带
-slim-build或-alpine的镜像(如python:3.11-slim-build),安装gcc、build-essential、setuptools等编译依赖 - 第二阶段用更小的运行时镜像(如
python:3.11-slim),不装任何构建工具 - 避免在 runtime 阶段执行
pip install,直接从 builder 复制已安装好的site-packages
精准复制,不带冗余文件
COPY 操作要克制,只拿真正需要的东西,别用 COPY . /app 再删文件——被删内容仍保留在镜像层里,体积不减。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- builder 阶段:先
COPY pyproject.toml requirements.txt .,再RUN pip install --no-cache-dir -e .或pip install -r requirements.txt - runtime 阶段:用
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages - 源码只复制业务代码目录,比如
COPY src/ /app/src/,跳过tests、docs、.git
用好 .dockerignore 和缓存顺序
构建上下文传得越少,启动越快;缓存命中的层级越多,重构建越省时。
- 在项目根目录写
.dockerignore,至少排除:node_modules、__pycache__、.git、logs、*.log、dist、venv - Dockerfile 中,把变动少的内容(如依赖文件)放在前面 COPY,变动频繁的(如源码)放后面
- 不要在
RUN pip install前COPY . /app,否则改一行代码就导致整个依赖安装层失效
精简入口与权限控制
最终镜像不需要 root 权限,也不该暴露调试工具或 shell 路径。
- runtime 阶段末尾加上
USER 1001:1001(非 root 用户),提前创建好用户和组 - 用
ENTRYPOINT+CMD分离固定启动逻辑和可变参数,比如ENTRYPOINT ["/app/entrypoint.sh"],CMD ["run"] - 如果用 shell 脚本启动,确保它有执行权限,且只包含必要检查(如配置存在性、端口占用)










