摘要:多阶段构建是一项新功能,需要守护程序和客户端上使用Docker 17.05或更高版本。多级构建对于在优化Dockerfile的同时使其易于阅读和维护的任何人都非常有用。 在进行多阶段构
多阶段构建是一项新功能,需要守护程序和客户端上使用Docker 17.05或更高版本。多级构建对于在优化Dockerfile的同时使其易于阅读和维护的任何人都非常有用。
在进行多阶段构建之前
关于构建镜像,最具挑战性的事情之一是保持镜像尺寸变小。Dockerfile中的每条指令都会在映像上添加一层,您需要记住在移至下一层之前清除不需要的任何工件。为了编写一个真正有效的Dockerfile,传统上,您需要使用Shell技巧和其他逻辑来使各层尽可能小,并确保每一层都具有上一层所需的工件,而没有其他任何东西。
实际上,通常只有一个Dockerfile用于开发(包含构建应用程序所需的一切),而精简的Dockerfile用于生产时,仅包含您的应用程序以及运行该应用程序所需的内容。这被称为“构建器模式”。维护两个Dockerfile是不理想的。
这是一个Dockerfile.build和Dockerfile的例子,它遵循上面的模式:
Dockerfile.build:
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
COPY app.go .
RUN go get -d -v golang.org/x/net/html \\
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
请注意,此示例还RUN使用Bash&&运算符将两个命令人工压缩在一起,以避免在镜像中创建额外的图层。这是容易失败的并且难以维护。
Dockerfile:
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY app .
CMD [./app]
build.sh:
#!/bin/sh
echo Building alexellis2/href-counter:build
docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \\
-t alexellis2/href-counter:build . -f Dockerfile.build
docker container create --name extract alexellis2/href-counter:build
docker container cp extract:/go/src/github.com/alexellis/href-counter/app ./app
docker container rm -f extract
echo Building alexellis2/href-counter:latest
docker build --no-cache -t alexellis2/href-counter:latest .
rm ./app
运行build.sh脚本时,它需要构建第一个镜像,从中创建一个容器以复制工件,然后构建第二个镜像。这两个映像都占用了系统空间,并且app 本地磁盘上也仍然有工件。
多阶段构建极大地简化了这种情况!
使用多阶段构建
通过多阶段构建,您可以FROM在Dockerfile中使用多个语句。每个FROM指令可以使用不同的基础,并且每个指令都
开始构建的新阶段。您可以有选择地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下不需要的所有内
容。为了展示它是如何工作的,让我们改编上一部分中的Dockerfile以使用多阶段构建。
Dockerfile:
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]
您只需要单个Dockerfile。您也不需要单独的构建脚本。只需运行docker build:
$ docker build -t alexellis2/href-counter:latest .
最终结果是与之前的镜像大小相同,并大大降低了复杂性。您无需创建任何中间映像,也不需要将任何工件提取到本地系统。
相关文章推荐
智能手机建站的优点是什么?网站页面布局有哪些关键点? 2022-01-10
2022年中国云计算面临的问题及发展前景预测分析2021-12-28
绿色智能基础设施连接可持续未来-IDCC2021万国数据第一代Smart DC发布会议程揭晓2021-12-27
阿里云:早期未意识到Apache log4j2漏洞情况的严重性 将强化漏洞管理2021-12-27
云计算开发:Python3-replace()方法详解2021-12-27