Docker多阶段构建理解:

  • 构建镜像需要有一个基础镜像,后续操作就会基于该基础镜像构建
  • docker镜像文件里有层级概念,每执行一次RUN指令,镜像就会多一层,所以通过减少层级来减少镜像大小
  • 多个from的时候,只有最后一个from的镜像才是镜像的根镜像

自己项目部署中多阶段构建示例, 这里基于golang基础镜像编译以后的二进制直接copy到基于alpine构建的最小镜像里:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM golang:1.12.7 as build
MAINTAINER wanzi <iwz2099@163.com>
 
# 编译配置相关
ARG NAME=gaia
ARG FLAGS=-tags=jsoniter
ARG GOOS=linux
ARG GOARCH=amd64
ARG PORT_TO_EXPOSE=10020
 
ENV GOPROXY https://mirrors.aliyun.com/goproxy/
ENV GO111MODULE on
 
WORKDIR /opt/gaia
COPY . .
RUN GOOS=$GOOS GOARCH=$GOARCH go build -mod vendor -ldflags="-s -w" -o $NAME $FLAGS
 
FROM alpine
WORKDIR /opt/gaia
COPY --from=build /opt/gaia/gaia .
RUN mkdir -p /opt/gaia/conf
VOLUME ["/opt/gaia/conf"]
 
CMD ["./gaia"]
EXPOSE $PORT_TO_EXPOSE