用于提升效率的多阶段构建
使用多阶段构建,通过分离构建依赖和运行时依赖,创建更小且更安全的生产镜像
用于提升效率的多阶段构建 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。
多阶段构建简介
欢迎学习高级 Dockerfile 优化!今天,我们将探索多阶段构建,这是一种用于创建更小、更高效 Docker 镜像的强大技术。
更小的镜像可以带来更快的下载速度、更高的安全性以及更好的资源利用率。

为什么镜像越小越好
构建 Docker 镜像时,其中通常会包含一些只在构建过程中需要、而在最终应用运行时并不需要的工具和依赖项。
- 拉取更快:更小的镜像下载速度更快。
- 占用更少磁盘空间:节省镜像仓库和主机上的存储空间。
- 减小攻击面:组件越少,潜在漏洞也越少。
- 提高安全性:生产镜像只包含必要内容。
单阶段构建的问题
以编译型应用为例,例如使用 Go 编写的应用。传统的单阶段 Dockerfile 会将完整的 Go 编译器和开发依赖项包含在最终镜像中。
这会使最终镜像远大于实际所需大小,因为运行已编译的二进制文件并不需要编译器。
单阶段示例(Go)
下面是一个简单的 Go 应用及其 Dockerfile,该文件在单个阶段中完成构建。请注意,构建环境也被包含在最终镜像中。
main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello from Single-Stage Docker!")
}单阶段 Dockerfile
这个 Dockerfile 使用 `golang:1.21-alpine` 作为基础镜像。应用构建完成后,这个庞大的基础镜像及其所有构建工具仍会保留在最终镜像中。
FROM golang:1.21-alpine
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
EXPOSE 8080
CMD ["./myapp"]多阶段构建的组成
多阶段构建通过允许您在单个 Dockerfile 中定义多个 `FROM` 指令来解决这个问题。每个 `FROM` 都会开始一个新的构建阶段。
- 使用
AS关键字为阶段命名(例如FROM golang:1.21-alpine AS builder)。 - 随后可以使用
COPY --from=<stage_name>从之前的阶段复制构建产物。
只有最后一个阶段会作为镜像保存。
多阶段结构
典型的多阶段 Dockerfile 至少包含两个阶段:
- 构建阶段:包含编译应用所需的全部工具和源代码。
- 运行阶段:使用最小化基础镜像,只包含已编译的应用和运行时依赖项。
构建阶段的中间镜像会被丢弃,只留下精简的最终镜像。
多阶段示例(Go)
我们来使用多阶段方法重写 Go 应用的 Dockerfile。我们将在第一个阶段构建应用,然后只将编译后的二进制文件复制到小得多的 `alpine` 基础镜像中。
# Stage 1: Build the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
# Stage 2: Create the final lightweight image
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]运行多阶段构建
构建这个 Dockerfile 时,Docker 会执行每个阶段。不过,只有最后一个 `FROM` 指令的内容,以及从之前阶段复制的文件,才会组成最终镜像。
与单阶段构建相比,这样得到的镜像会小得多,因为 Go 编译器和构建工具会留在之前的阶段中。
多阶段构建的优势
多阶段构建对于以下场景非常有用:
- 编译型语言:Go、Java、C++、Rust。
- 前端框架:构建 React/Angular 应用,并使用 Nginx 提供静态资源。
- Node.js 应用:在构建阶段安装 `node_modules`,然后只将 `package.json`、`package-lock.json` 和构建后的应用复制到精简的运行时镜像中。
检查您的知识
以下哪些是使用多阶段 Docker 构建的主要优势?
回顾:多阶段构建的效率
您已经了解了多阶段 Docker 构建!
- 它们会在单个 Dockerfile 中使用多个
FROM指令。 AS关键字用于命名阶段,而COPY --from=用于传输构建产物。- 其主要优势是最终镜像体积大幅减小,同时更加安全、高效。
这项技术对于优化容器化应用至关重要。接下来,我们将了解如何利用构建缓存!
常见问题解答
「用于提升效率的多阶段构建」课时是免费的吗?
是的 — 「用于提升效率的多阶段构建」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。
「用于提升效率的多阶段构建」这节课中我会学到什么?
使用多阶段构建,通过分离构建依赖和运行时依赖,创建更小且更安全的生产镜像 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DevOps Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「用于提升效率的多阶段构建」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DevOps Bootcamp 课中编写并运行代码吗?
能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。