在 Docker 中,如何构建多阶段镜像以减少镜像体积?

回答重点


在 Docker 中,通过使用多阶段构建,可以显著减少镜像的体积。多阶段构建的核心思想是:利用一个以上的 FROM 指令,在初始阶段构建镜像时包含完整的构建环境,而在随后的阶段仅保留真正的运行环境和必要的文件。这样,可以避免把不必要的构建工具和依赖打包到最终的镜像中。

一个典型的多阶段构建的 Dockerfile 例子如下:

# 第一阶段:构建阶段,编译代码
FROM golang:1.17 as builder
 
# 设置工作目录
WORKDIR /app
 
# 将源码复制到容器里
COPY . .
 
# 运行构建命令
RUN go build -o myapp
 
# 第二阶段:运行阶段,复制二进制文件
FROM alpine:latest
 
# 设置工作目录
WORKDIR /app
 
# 从第一个构建阶段复制二进制文件到当前镜像里
COPY --from=builder /app/myapp .
 
# 设置容器启动命令
CMD ["./myapp"]

 

通过上述 Dockerfile,我首先使用 Golang 镜像编译代码,然后在更轻量的 Alpine 镜像中运行编译后的二进制文件。这样,最终生成的镜像不会包含 Go 的构建工具,体积也会大大减小。

扩展知识


1)镜像层和缓存:在使用多阶段构建时,每个 FROM 指令会创建一个新的阶段,这些阶段是独立的,但它们之间可以通过 COPY –from= 共享文件。Docker 使用镜像层和缓存机制,使得多阶段构建的镜像管理更加高效。
2)优化构建顺序:构建顺序对镜像的缓存利用率有很大的影响。应该把不经常变动的命令和文件放在前面,例如安装基础依赖包,较频繁变动的文件,例如代码,放在最后。这样可以有效利用 Docker 缓存,减少每次构建的时间。

3)环境变量和多阶段:可以通过 ARG 和 ENV 指令在不同的构建阶段传递参数和设置环境变量。在多阶段构建中,注意合理使用这些指令,有助于提升镜像文件的可配置性和灵活性。

4)清理不必要的文件:在每个阶段的末尾,可以通过删除不必要的文件和依赖来进一步减小镜像的体积。虽然多阶段构建本身已经很有效,但清理无用文件仍然可以锦上添花。

5)自动化构建和测试:在多阶段构建中,可以添加一个中间阶段专门用于测试。通过这种方式,可以在构建过程中执行单元测试或其他验证,确保最终镜像中的代码是经过正确测试且稳定的。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
win

‌Rainmeter‌(雨滴插件)

2024-11-8 8:05:42

docker

什么是 Docker?为什么要在项目中用到 Docker?以及你在项目中是如何使用 Docker 的?

2024-10-28 14:29:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索