多步构建go镜像

240 阅读1分钟

什么是多步构建

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,一个数量级的缩小

企业微信截图_9899214d-2235-42d8-a170-527688bd02fe.png