编写Dockerfile的时候会遇到一个问题,制作镜像的时候由于需要编译可执行文件而引入了大量运行时不需要的工具,导致镜像特别大。比如:为了编译一个go的可执行文件,需要引入golang这个官方镜像进行编译,这个镜像大小是810M,但是真正运行的时候是不需要如此大的镜像的。那么 multi-stage builds 就起到了很大的作用
hello.go
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println("hello world")
time.Sleep(time.Second)
}
}
Dockerfile
FROM golang as compile_stage
COPY ./hello.go /tmp/hello.go
RUN go build -o /tmp/hello /tmp/hello.go
FROM alpine
# 从之前那个golang镜像环境中将编译好的hello拷贝过来
COPY --from=compile_stage /tmp/hello .
CMD ["./hello"]
多阶段构建出来的镜像是以最后那个FROM为基础的
这样go build -t hello . 制作出来的镜像只有7M多,而golang镜像本身就有810M,相差甚大