Docker多阶段构建
# 需求背景
# 1. 背景
go项目部署时只需要提供build出来的二进制包
go 项目build出来的二进制包对于不同架构的机器和系统并不兼容
# 2. 需求
- docker 构建的镜像要尽可能的小
- 构建出镜像与线上环境环境完美兼容
# 3. 方案
- 将可执行文件放入最小镜像alpine中 ✅
- 例如用window开发, 线上环境为centos7X86环境, 我们就可以在window中安装centos7x86虚拟环境, 上传代码到虚拟机,构建完镜像上传生产环境. 可行不? 可行! 麻烦不?是真麻烦! 多出了一个操作步骤,而且通用镜像编译后的文件在 alpine 镜像中不一定能执行。❎
- 多阶段构建 ,简单好用✅
# 多阶段构建
- Docker 17.05版本以后,官方提供了一个新的特性:
Multi-stage builds
(多阶段构建)。 - 多阶段构建,就是可以在一个
Dockerfile
中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基础镜像,并表示开始一个新的构建阶段。你\可以很方便的将一个阶段的文件复制到另外一个阶段,在最终的镜像中保留下你\需要的内容即可。
# 1. demo
代码示例
# 一阶段 (模拟生产环境构建项目代码) FROM golang:1.7.3 as builder WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . # 二阶段 (构键最终镜像) FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY /go/src/github.com/alexellis/href-counter/app . CMD ["./app"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14docker build -t app:latest .
# 2. 停在特定的构建阶段
构建镜像时,不一定需要构建整个Dockerfile每个阶段。可以指定目标构建阶段。以下命令假定您使用的是以前的Dockerfile,但在名为builder的阶段停止
docker build --target builder -t alexellis2/href-counter:latest .
1使用场景:
- 调试特定的构建阶段
- 在debug阶段,启用所有调试或工具,而在production阶段尽量精简
- 在testing阶段,您的应用程序将填充测试数据,但在production阶段则使用生产数据
# 3. 使用外部镜像作为stage
可以使用COPY –from指令从单独的image中复制,使用本地image名称,本地或Docker注册表中可用的标记或标记ID。
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
1
上次更新: 2023/05/04, 15:30:48