真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Docker多階段構(gòu)建最佳實(shí)踐-創(chuàng)新互聯(lián)


Docker目前在容器市場可以說是占領(lǐng)了大部分市場,Docker掀起了容器革命,同時也改變了現(xiàn)代化云平臺的構(gòu)建方式。盡管Docker很強(qiáng)大,但使用過程當(dāng)中也遇到了一些問題。比如說我想要構(gòu)建一個編譯型語言鏡像,需要先在一個Dockerfile中編譯,然后再使用另外一個Dockerfile把編譯好的文件放到鏡像中。這樣無形當(dāng)中就增大了CI/CD的復(fù)雜度。

成都創(chuàng)新互聯(lián)專注于鄂城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供鄂城營銷型網(wǎng)站建設(shè),鄂城網(wǎng)站制作、鄂城網(wǎng)頁設(shè)計、鄂城網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造鄂城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鄂城網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

Docker多階段構(gòu)建是17.05以后引入的新特性,旨在解決編譯和構(gòu)建復(fù)雜的問題。減小鏡像大小。因此要使用多階段構(gòu)建特性必須使用高于或等于17.05的Docker。

多階段構(gòu)建出現(xiàn)之前

構(gòu)建鏡像最具挑戰(zhàn)性的一點(diǎn)是使鏡像大小盡可能的小。Dockerfile中的每條指令都為圖像添加了一個圖層,您需要記住在移動到下一層之前清理任何不需要的工件。

為了編寫一個真正高效的Dockerfile,傳統(tǒng)上需要使用shell技巧和其他邏輯來保持層盡可能小,并確保每個層都具有前一層所需的工件而不是其他任何東西。

實(shí)際上,有一個Dockerfile用于開發(fā)(包含構(gòu)建應(yīng)用程序所需的所有內(nèi)容),以及用于生產(chǎn)環(huán)境的精簡版Dockerfile,它只包含您的應(yīng)用程序以及運(yùn)行它所需的內(nèi)容。這被稱為“建造者模式”。維護(hù)兩個Dockerfiles并不理想。

這是一個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= GOOS=linux go build -a -installsuffix cgo -o app .

請注意,此示例使用Bash &&運(yùn)算符人為壓縮兩個RUN命令,以避免在image中創(chuàng)建其他層。這很容易出錯并且難以維護(hù)。

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

當(dāng)您運(yùn)行build.sh腳本時,它需要構(gòu)建第一個image,從中創(chuàng)建容器以復(fù)制工件,然后構(gòu)建第二個image。

多階段構(gòu)建大大簡化了這種情況!

使用多階段構(gòu)建

對于多階段構(gòu)建,您可以在Dockerfile中使用多個FROM語句。每個FROM指令可以使用不同的基礎(chǔ),并且每個指令都開始一個新的構(gòu)建。您可以選擇性地將工件從一個階段復(fù)制到另一個階段,從而在最終image中只留下您想要的內(nèi)容。

為了說明這是如何工作的,讓我們調(diào)整上述示例的Dockerfile以使用多階段構(gòu)建。

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= GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest 
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from= /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
您只需要單個Dockerfile。您也不需要單獨(dú)的構(gòu)建腳本。只需運(yùn)行docker build:
$ docker build -t app:latest .

最終結(jié)果是產(chǎn)生與之前相同大小的image,復(fù)雜性顯著降低。您不需要創(chuàng)建任何中間image,也不需要將任何artifacts提取到本地系統(tǒng)。

它是如何工作的?第二個FROM指令以alpine:latest image為基礎(chǔ)開始一個新的構(gòu)建階段。

COPY –from = 0行僅將前一階段的構(gòu)建文件復(fù)制到此新階段。Go SDK和任何中間層都被遺忘,而不是保存在最終image中。

為多構(gòu)建階段命名

默認(rèn)情況下,階段未命名,您可以通過整數(shù)來引用它們,從第0個FROM指令開始。

但是,您可以通過向FROM指令添加as NAME來命名您的階段。此示例通過命名階段并使用COPY指令中的名稱來改進(jìn)前一個示例。

這意味著即使稍后重新排序Dockerfile中的指令,COPY也不會中斷。

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= 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"]

停在特定的構(gòu)建階段

構(gòu)建映像時,不一定需要構(gòu)建整個Dockerfile每個階段。

可以指定目標(biāo)構(gòu)建階段。以下命令假定您使用的是以前的Dockerfile,但在名為builder的階段停止:

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

使用此功能可能的一些非常適合的場景是:

?調(diào)試特定的構(gòu)建階段
?在debug階段,啟用所有調(diào)試或工具,而在production階段盡量精簡
?在testing階段,您的應(yīng)用程序?qū)⑻畛錅y試數(shù)據(jù),但在production階段則使用生產(chǎn)數(shù)據(jù)

使用外部鏡像作為stage

使用多階段構(gòu)建時,您不僅可以從Dockerfile中創(chuàng)建的鏡像中進(jìn)行復(fù)制。

您還可以使用COPY –from指令從單獨(dú)的image中復(fù)制,使用本地image名稱,本地或Docker注冊表中可用的標(biāo)記或標(biāo)記ID。

如有必要,Docker會提取image并從那里開始復(fù)制。

語法是:

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

原文鏈接: https://wilhelmguo.tk/blog/post/william/Docker 構(gòu)建之多階段構(gòu)建


 


當(dāng)前文章:Docker多階段構(gòu)建最佳實(shí)踐-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://weahome.cn/article/dsoejd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部