Dockerfile-多阶段构建(3)
将构建阶段命名
缺省情况下,阶段是没有命名的,但是我们可以通过他们的索引来引用他们,第一个FROM就是从0开始。
但是,这样也不太好,可读性还差那么点,因为我们完全可以用想要的名字来命名,如果你需要也可以自己加上阶段索引,我们可以通过将AS < NAME >来命名阶段。
下面这段用例,命名了阶段,并且在COPY指令中使用名称来改进前一个用例。这意味着我们的Dockerfile中的命令重新排序了,COPY也不会中断。
# syntax=docker/dockerfile:1
FROM golang:1.16 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"]
停在一个指定的构建阶段
多阶段构建真的提供了不少花活,但我们不想构建整个镜像的时候,我们可以指定停在一个阶段(这有什么场景吗?)我感觉大多数的多阶段构建设计,都是为了最终的镜像吧,可能是我接触的太少了,接着看吧。下面这段用例假设我们使用上方的dockerfile来构建的,然后就可以停在builder构建阶段。
docker build --target builder -t alexellis2/href-counter:latest .
官方紧接着给了几个场景,好评
- 当我我们需要debug一些具体构建阶段的时候
- 官方推荐可以给一个debug阶段,该阶段将所有debug工具打开,然后进入production阶段
- 使用testing阶段,如果app需要用一些数据来测试的话,然后production阶段可以用真实数据
基本都是帮助我们debug,和测试的。
使用外部镜像作为一个阶段
使用多阶段构建时,不仅限于从之前的Dockerfile中创建的阶段进行复制。我们可以用COPY --from指令从独立的镜像中复制,可以使用本地的镜像名称,本地或Docker注册表上的ID,下面是用例:
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
网友评论