docker镜像多阶段构建

docker镜像多阶段构建

多阶段构建(multi-stage builds)是 Docker 的一个功能,用于简化 Docker 镜像的构建过程并减小镜像体积。它允许你在一个 Dockerfile 中定义多个构建阶段,只将最终的产物复制到最后的镜像中,从而避免不必要的文件和依赖被包含在最终镜像中。

下面是一个简单的多阶段构建示例,演示如何构建一个 Go 应用程序。

1. 示例项目结构

.
├── Dockerfile
├── main.go

main.go 文件内容:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

2. Dockerfile内容

Dockerfile内容如下:

# 第一阶段:构建应用程序
FROM golang:1.18 AS builder

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . .

# 编译应用程序
RUN go build -o myapp

# 第二阶段:创建最终镜像
FROM alpine:latest

# 设置工作目录
WORKDIR /app

# 从第一阶段复制可执行文件
COPY --from=builder /app/myapp .

# 运行应用程序
CMD ["./myapp"]

解释说明

  1. 第一阶段:构建应用程序

    • 使用 golang:1.18 镜像作为基础镜像。
    • 设置工作目录为 /app
    • 复制项目文件到容器内。
    • 运行 go build 命令编译 Go 应用程序,并生成可执行文件 myapp
  2. 第二阶段:创建最终镜像

    • 使用 alpine:latest 作为基础镜像。Alpine 是一个体积很小的 Linux 发行版,非常适合用于构建最终的容器镜像。
    • 设置工作目录为 /app
    • 从第一阶段的镜像中复制 myapp 可执行文件到当前阶段的工作目录。
    • 设置容器启动时执行的命令为 ./myapp

最终的镜像基于alpine镜像,只包含 myapp 可执行文件,而不包含 Go 的编译器或任何不必要的依赖,体积较小。

3. 构建和运行镜像

  1. 构建 Docker 镜像:
docker build -t myapp:latest .
  1. 运行 Docker 容器:
docker run --rm myapp:latest

输出应为:

Hello, World!

4. 多阶段构建优点

  • 减小镜像体积:通过只将必要的文件复制到最终的镜像中,减小了镜像的体积。
  • 提高安全性:减少了最终镜像中的不必要的工具和依赖,降低了攻击面。
  • 简化构建过程:在一个 Dockerfile 中管理所有的构建阶段,简化了构建和维护过程。

多阶段构建非常适合用于编译型语言(如 Go、Java、C++)的项目,也可以用于前端项目的构建(如构建 React 或 Angular 应用并将其部署到 Nginx 容器中)。

相关资料

  1. https://docs.docker.com/build/building/multi-stage/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值