IT评测·应用市场-qidao123.com技术社区

标题: 「Docker 镜像多阶段构建」:让你的容器更小、更快、更安全! [打印本页]

作者: 我可以不吃啊    时间: 2025-4-11 17:17
标题: 「Docker 镜像多阶段构建」:让你的容器更小、更快、更安全!
欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可参加学习交流群。↓↓↓

  关注公众号,免费学技术,免被割哦~
  在容器化应用的开发过程中,镜像体积越小,构建速率越快,摆设服从也就越高。而 Docker 多阶段构建(Multi-Stage Build)是一种优化 Docker 镜像的利器,可以显著减少终极镜像的体积,同时保持构建过程的机动性。本文将详细先容多阶段构建的根本原理、优化本领,并结合实战案例,帮助你打造更轻量、高效的 Docker 镜像。
  1. 传统构建 vs. 多阶段构建

  在没有使用多阶段构建之前,我们通常会在一个 Dockerfile 中完成全部的构建步骤,包罗编译、打包、安装依赖等。这种方式的主要问题是:
  1)冗余依赖:构建时的工具和库会被打包进终极镜像,导致体积巨大。
  2)安全性低:多余的工具和开发环境增长了安全风险。
  3)构建服从低:每次构建都会重新拉取和安装全部依赖。
  多阶段构建的核心头脑是:将构建过程拆分成多个阶段,只在终极阶段保留须要的文件,避免无关的构建工具、编译器等被打包进终极镜像,从而优化镜像体积,提高安全性和构建服从。
  
  2. 多阶段构建的根本用法

  示例:构建 Go 应用

  假设我们有一个简朴的 Go Web 应用(main.go):
  1. package main
  2. import (    "fmt"    "net/http")
  3. func handler(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "Hello, Docker Multi-Stage Build!")}
  4. func main() {    http.HandleFunc("/", handler)    http.ListenAndServe(":8080", nil)}
复制代码
如果直接编写 Dockerfile,可能会这样做:
  1. FROM golang:1.21 AS builderWORKDIR /appCOPY . .RUN go build -o app
  2. FROM alpine:latestWORKDIR /root/COPY --from=builder /app/app .CMD ["./app"]
复制代码
解析: