多阶段构建

一、多阶段构建原理
多阶段构建,是在Dockerfile中使用多个FROM指令,每个FROM指令可以使用不同的基础镜像,并且每个指令都开始一个新的构建,可以选择性地将一个阶段构建中生成的文件复制到另一个阶段,从而在最终image中只留下您想要的内容,缩小最终镜像的大小。

二、多阶段构命令详解
1、默认情况下阶段未命名,可以通过整数来引用它们,从第0个FROM指令开始。
示例1、

FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  

2.通过向FROM指令添加as NAME来命名您的阶段,可以通过阶段名来引用,这意味着即使稍后重新排序Dockerfile中的指令,COPY也不会中断。
示例2、

FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"] 

3、停在特定的构建阶段,构建镜像时,不一定需要构建整个Dockerfile每个阶段。
可以指定目标构建阶段。以下命令假定使用的是以前的Dockerfile,但在名为builder的阶段停止:

$ docker build --target builder -t alexellis2/href-counter:latest .

此功能主要运用到一下场景:
a、调试特定的构建阶段
b、在debug阶段,启用所有调试或工具,而在production阶段尽量精简
c、在testing阶段,您的应用程序将填充测试数据,但在production阶段则使用生产数据

4、使用外部镜像作为构建阶段
使用多阶段构建时,您不仅可以从Dockerfile中创建的镜像中进行复制。
您还可以使用COPY –from指令从单独的image中复制,使用本地image名称,本地或Docker注册表中可用的标记或标记ID。
如有必要,Docker会提取image并从那里开始复制。
语法是:

COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

猜你喜欢

转载自blog.csdn.net/q13554515812/article/details/84478215