Docker在17.05引入了多阶段构建的功能,就是将之前需要多次运行build的Dockerfile,现在可以写到一个里面,只build一次,就可以达到同样的效果。
另外,实际应用中,还可以通过这样,非常简单的将最后可执行文件放入极小的镜像中使用。
比如之前说过的,做一个Beego的Docker镜像,如果使用官方的镜像运行,占用空间稍微有点大了,虽然比起Ubuntu,CentOS动辄5-600M还好一些,但是再跟只有10几M,甚至几M的相比,还是太大了。
下面通过一个Dockerfile来了解一下:
#指定构建镜像
FROM golang:1.9.2 as builder
#指定工作目录
WORKDIR /go/src/app
#将当前项目文件copy到够姜镜像的工作目录中
COPY . .
#在构建镜像中执行go build,这里指定了构建的目标平台,具体的构建命令针对具体情况修改即可
#也可简单的 go build 即可
#另外需要注意依赖包的问题
RUN CGO_ENABLED=0 GOOS=linux go build -x -v -ldflags '-w -s' -a -o app .
#使用alpine作为运行的镜像
FROM alpine:latest
#指定工作目录
WORKDIR /go/src/app
#如果程序中涉及到需要连接DB,并且需要指定时区,需要copy时区文件,为了省事,直接从构建镜像中复制了,可以正常使用
COPY --from=builder /usr/local/go/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
#将构建镜像中build完成的可执行文件copy到工作目录
COPY --from=builder /go/src/app/app ./app
EXPOSE 8080
CMD ["./app"]
以上就是使用多阶段构建的Dockerfile了,非常明了,只需要docker build就可以了。
然而目前公司的测试环境还没升级到17.05,并不能使用此功能。