多阶段构建(Multi-stage builds)
多阶段构建是 Docker 提供的一种镜像优化技术,通过在一个 Dockerfile 中使用多个 FROM 指令,将构建环境与运行环境分离,从而生成体积更小、干净的生产镜像。
1. 多阶段构建原理
- 每个
FROM指令定义一个阶段(Stage) - 前一个阶段可以构建编译产物或依赖
- 最终阶段只复制需要的运行文件,减少无用层和文件
2. 示例:Go 应用多阶段构建
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 运行阶段
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
`
builder阶段安装编译工具并构建应用- 最终镜像只包含可执行文件,体积小且安全
3. 示例:Node.js 应用多阶段构建
# 构建阶段
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
- 构建阶段完成依赖安装和代码打包
- 运行阶段只包含静态文件和轻量 Web 服务器
4. 多阶段构建优势
- 显著减小最终镜像体积
- 隔离构建工具和生产环境
- 提高安全性,减少攻击面
- 利于 CI/CD 自动化构建和部署
5. 最佳实践
- 仅复制运行所需的文件到最终阶段
- 合理命名阶段,便于管理和调试
- 尽量选择轻量基础镜像作为最终阶段
- 利用缓存,优化重复构建时间
掌握多阶段构建技术,可以有效优化 Docker 镜像,提升开发、测试和生产环境的部署效率。
相关内容
- 构建自定义 Registry 本章节介绍如何搭建和管理 Docker 私有 Registry,包括部署自定义 Registry、配置存储与访问权限、镜像推送与拉取流程,以及安全与备份策略,满...
- 与 Kubernetes 的比较与协作 本章节对比 Docker 与 Kubernetes 的异同点,并讲解两者的协作方式,包括容器管理、编排、服务发现、部署流程和最佳实践,帮助理解容器生态系统中的应...
- Rootless Docker 与安全边界 本章节介绍 Rootless Docker 的使用方法及安全边界管理,包括非 root 容器运行原理、配置步骤、权限限制和网络隔离策略,提升容器安全性并降低宿主...
- 常用命令速查表 本章节提供 Docker 常用命令速查表,包括镜像管理、容器操作、网络配置、卷管理、日志查看及调试命令,帮助开发者快速查找和使用 Docker 命令,提高容器管...
- 参考文档与学习资源 本章节整理 Docker 官方文档、社区资源、教程和示例项目,帮助开发者系统学习 Docker 技术,掌握容器化应用的构建、运行、管理和优化方法。
- 示例项目与练习 本章节提供 Docker 示例项目和练习,包括容器化应用部署、Docker Compose 多服务编排、镜像优化、网络配置和存储管理,帮助开发者通过实战加深对...