Docker 多阶段构建是为了创建轻量化和更高效的 Docker 镜像而产生的一种技术。通过使用多阶段构建,可以将不同阶段的构建需求分离开来,最终结果只包含实际部署所需要的部分,从而缩小镜像的大小。
以下是使用多阶段构建的基本步骤:
初始构建阶段:构建需要完整环境和工具的部分,如编译代码。
最终构建阶段:从初始阶段复制所需文件,只保留运行时所需的部分。
一个简单的例子
假设你有一个简单的 Go 应用程序。使用多阶段构建来创建其 Docker 镜像。
app.go
package main
import "fmt"
func main(){
fmt.Printf("Hello World!");
}
Dockerfile
#阶段1
FROM golang:1.16
WORKDIR /go/src
COPY app.go ./
RUN go build -o myapp app.go
#阶段2
FROM scratch
WORKDIR /server
COPY --from=0 /go/src/myapp ./
CMD ["./myapp"]
docker build --no-cache -t server_app:v2 . -f Dockerfile.build
或者这样写
#阶段1
FROM golang:1.16 as builder
WORKDIR /go/src
# 复制源码并编译
COPY app.go ./
RUN go build -o myapp app.go
#第二阶段:仅包含运行时环境
FROM scratch
WORKDIR /server
# 从构建阶段复制编译好的可执行文件
COPY --from=builder /go/src/myapp ./
# 指定启动命令
CMD ["./myapp"]