自 17.05 版本开始,Docker 支持多步骤镜像创建( Multi-stage build)特性,可以精简最终生成的镜像大小 。
对于需要编译的应用(如 C、Go或Java语言等)来说,通常情况下至少需要准备两个 环境的 Docker镜像:
- 编译环境镜像 : 包括完整的编译引擎、依赖库等,往往比较庞大。作用是编译应用为二进制文件;
- 运行环境镜像: 利用编译好的二进制文件,运行应用,由于不需要编译环境,体积比较小。
使用多步骤创建,可以在保证最终生成的运行环境镜像保持精筒的情况下,使用单一的Dockerfile,降低维护复杂度 。
以 Go语言应用为例。创建干净目录,进入到目录中,创建main.go文件,内容为:
// main.go will output "Hello, Docker"
package main
import ("fmt")
func main() {
fmt.println("Hello, Docker")
}
创建 Dockerfile,使用 golang:1.9镜像编译应用二进制文件为 app,使用精简的镜像 alpine:latest 作为运行环境 。Dockerfile 完整内容为:
FROM golang:1.9 as builder # define stage name as builder
RUN mkdir -p /go/src/test
WORKDIR /go/src/test
COPY main.go
RUN CGO_ENABLED=O GOOS=linux go build -o app
FROM alpine:latest
RUN apk –no-cache add ca-certificates
WORKDIR /root/
COPY –from=builder /go/src/test/app . # copy file from the builder stage
CMD ["./app"]
执行如下命令创建镜像,并运行应用:
$ docker build -t yeasy/test multistage:latest .
Sending build context to Docker daemon 3.072kB
Step 1/10 : FROM golang:1.9
Successfully built 5fd0cb93dda0
Successfully tagged yeasy/test-multistage:latest
$ docker run --rm yeasy/test-m ultistage:latest
Hello, Docker
查看生成的最终镜像,大小只有 6.55 MB:
$docker images | grep test-multistage
yeasy/test-multistage latest 5fd0cb93dda0 1 minutes ago 6.55MB
文章来源:
《Docker技术入门与实践》第三版 杨保华、戴王剑、曹亚仑 编著