Docker 17.05 或者更高版本支持 multi-stage builds ,即多阶段构建docker镜像。multi-stage builds,最主要的目的是优化镜像,减小镜像体积。
这里以构建go程序为例。

一个简单的go程序

打印hello world, 版本信息和第一个命令行参数

  1. // app.go
  2. package main
  3. import (
  4. "fmt"
  5. "os"
  6. "runtime"
  7. )
  8. func main() {
  9. fmt.Println("Hello World,", runtime.Version(), os.Args[1])
  10. }

Dockerfile

  1. # build stage
  2. FROM golang:alpine AS build
  3. ADD . /src
  4. RUN cd /src && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app
  5. # final stage
  6. FROM scratch
  7. WORKDIR /app
  8. LABEL name=hiyang
  9. COPY --from=build /src/app /app/
  10. ENTRYPOINT ["./app"]

从上面可以看到,透过AS--from互相沟通,以前需要写两个 Dockerfile,现在只要一个就可以搞定。

golang:alpine 较小的go环境 scratch Dokcer 所提供的最小 Image CGO_ENABLED=0 采用静态编译,编译后的体积变大,但是没有外部依赖,可以在scratch环境运行

构建

  1. $ docker build -t hiyang/go-app .
  2. $ docker run --rm hiyang/go-app hiyang
  3. Hello World, go1.14.6 hiyang

构建后的体积大概是2.07M