本文是《Docker必知必会系列》第六篇,原文发布于个人博客:悟尘纪。
一、引言
如何减小所构建镜像的体积最非常具有挑战性的事情。Docker 17.05版本以后,新增了Dockerfile多阶段构建。所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 FROM
指令。
二、单 Dockerfile 构建镜像
如果将所有的构建过程都包含在一个 Dockerfile
中,包括项目及其依赖库的编译、测试、打包等流程,这样会带来的一些问题:
- 镜像层次多,镜像体积较大,部署时间变长
- 源代码存在泄露的风险
下面是一个简单示例:
FROM golang:1.14-alpine
RUN apk --no-cache add git ca-certificates
WORKDIR /go/src/github.com/go/lixl.cn/helloworld/
COPY app.go .
RUN go get -d -v github.com/go-sql-driver/mysql \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . \
&& cp /go/src/github.com/go/lixl.cn/helloworld/app /root
WORKDIR /root/
CMD ["./app"]
构建镜像:docker build -t go/helloworld:1 -f Dockerfile1 .
三、Builder 模式构建
为了解决上面提到的问题,可以采用 Builder 模式:创建两个