Docker怎么利用多阶段构建减小生成的镜像体积

云瑶酱_9732

云瑶酱_9732

2026-10-02

243人浏览

原创

多阶段构建通过分离构建与运行阶段,仅复制必要产物到极简基础镜像(如alpine或scratch),精准剥离编译器、源码、缓存等运行时无用内容,使镜像从几百mb压至十几mb。

docker怎么利用多阶段构建减小生成的镜像体积

要让Docker镜像从几百MB压缩到十几MB,必须把编译器、源码、依赖缓存这些运行时完全用不到的东西彻底剥离——多阶段构建就是专门干这件事的机制。

理解多阶段构建的本质

传统单阶段构建会把整个构建过程“快照”进最终镜像:你装了gcc、跑了go build、留了node_modules,它们全被固化在层里。而多阶段构建允许你在同一个Dockerfile里定义多个独立环境,只让指定文件跨阶段流动。

关键不是“用了几个FROM”,而是【每个阶段必须有明确角色:要么纯构建,要么纯运行】。混用会导致体积反弹——比如在运行阶段RUN apk add curl,就等于主动往精简镜像里塞工具。

写出第一个多阶段Dockerfile

方法一:Go应用最小化(推荐新手起步)

第一步:创建构建阶段,使用带Go环境的镜像

FROM golang:1.22-alpine AS builder

第二步:设置工作目录并复制源码

WORKDIR /app
COPY . .

第三步:静态编译,禁用CGO避免运行时依赖glibc

RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-s -w' -o myapp ./cmd/server

第四步:切换至极简运行环境

FROM alpine:3.20
RUN apk --no-cache add ca-certificates

Dolphindb Docker
Dolphindb Docker

自动化 DolphinDB Docker 部署,支持自动架构检测(ARM64/x86_64),智能内存分配(50% 规则)以及完整数据持久化。

下载

第五步:仅复制上一阶段编译好的二进制文件

COPY --from=builder /app/myapp /usr/local/bin/myapp

第六步:声明运行命令

EXPOSE 8080
CMD ["/usr/local/bin/myapp"]

Java项目多阶段瘦身要点

方法1:Maven构建 + Alpine运行

构建阶段用maven:3.9-openjdk-17-slim,运行阶段切alpine:3.20+手动安装jre17-jre。注意【不要用openjdk:17-jre-slim,它比alpine+精简jre大3倍】。

方法2:跳过JRE,直奔Distroless

运行阶段改用gcr.io/distroless/java17-debian12,体积压到90MB以内,且彻底移除shell——连exec进入容器调试都不行,但攻击面归零。

这一步不能省:在构建阶段的pom.xml里配置maven-shade-plugin,把所有依赖打成fat jar,否则COPY时要手动处理一堆jar包。

避坑指南:这些操作会让多阶段失效

错误写法:在最终阶段执行RUN apt-get install或RUN pip install——这会把包管理器和下载的wheel文件全打进镜像。

危险操作:COPY --from=builder /app/ . ——斜杠结尾会递归复制整个/app目录,包括.git、tests、README.md等无关文件。

致命疏漏:没加.dockerignore文件,导致vendor/、node_modules/、target/这些巨型目录被COPY指令意外带上。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

docker

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

665

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

4719

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

5617

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2113

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

219

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

411

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

380

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

285

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

385

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程