<rp id="igllo"><object id="igllo"><blockquote id="igllo"></blockquote></object></rp>

    <dd id="igllo"></dd>
    <dd id="igllo"><track id="igllo"></track></dd>

    <dd id="igllo"><big id="igllo"></big></dd>
  • <legend id="igllo"><table id="igllo"></table></legend>
  • <ol id="igllo"><object id="igllo"><blockquote id="igllo"></blockquote></object></ol>
      <nav id="igllo"><center id="igllo"><td id="igllo"></td></center></nav>

        重庆小潘seo博客

        当前位置:首页 > 重庆网络营销 > 小潘杂谈 >

        小潘杂谈

        云计算核心技术Docker教程:Docker多阶段构建

        时间:2020-09-29 21:20:12 作者:重庆seo小潘 来源:
        多阶段构建是一项新功能,需要守护程序和客户端上使用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 .

        最终结果是与之前的镜像大小相同,并大大降低了复杂性。您无需创建任何中间映像,也不需要将任何工件提取到本地系统。

        青青国产成人久久111网站_双指探洞疼哭了_夫妻生活片_午夜a片无码区在线观看