什么是多步构建
Docker 17.05版本以后,官方就提供了一个新的特性:Multi-stage builds(多阶段构建)。 使用多阶段构建,你可以在一个 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基础镜像,并表示开始一个新的构建阶段。你可以很方便的将一个阶段的文件复制到另外一个阶段,在最终的镜像中保留下你需要的内容即可。
多步构建的好处
- 镜像大小远小于之前
- 只需要一个Dockerfile定义整个构建过程
- 可以选用更适合的基础镜像
实践
go代码
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w,"Hi, This is an example of http service in golang!\n")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Dockerfile
FROM golang:1.13.5-alpine3.10
WORKDIR /build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -o myapp .
WORKDIR /app
ENTRYPOINT ["/app/myapp"]
执行docker build -t demo:v1 .编译镜像
使用docker images|grep demo查看镜像大小,可以看到这么简单的一段代码构建出来的镜像将近400M
多步构建
dockerfile:
FROM golang:1.13.5-alpine3.10 AS builder
WORKDIR /build
COPY . .
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o myapp .
FROM alpine:3.10 AS final
WORKDIR /app
COPY --from=builder /build/myapp /app/
ENTRYPOINT ["/app/myapp"]
执行docker build -t demo:v2 .编译镜像
可以看到多步构建,使用alpine为基础镜像后,镜像大小只有13M,一个数量级的缩小