欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Dockerfile中multi-stage怎么構(gòu)建

本篇內(nèi)容介紹了“Dockerfile中multi-stage怎么構(gòu)建”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的鄰水網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

常見的容器鏡像構(gòu)建過程

比如我們創(chuàng)建了一個 go 語言編寫了一個檢查頁面中超級鏈接的程序 app.go(請從  ()獲取本文相關(guān)的代碼):

package main
import (
 "encoding/json"
 "fmt"
 "log"
 "net/http"
 "net/url"
 "os"
 "strings"
 "golang.org/x/net/html"
)
type scrapedatastore struct {
 internal int `json:"internal"`
 external int `json:"external"`
}
func isinternal(parsedlink *url.url, siteurl *url.url, link string) bool {
 return parsedlink.host == siteurl.host || strings.index(link, "#") == 0 || len(parsedlink.host) == 0
}
func main() {
 urlin := os.getenv("url")
 if len(urlin) == 0 {
 urlin = "https://www.cnblogs.com/"
 }
 resp, err := http.get(urlin)
 scrapedata := &scrapedatastore{}
 tokenizer := html.newtokenizer(resp.body)
 end := false
 for {
 tt := tokenizer.next()
 switch {
 case tt == html.starttagtoken:
 token := tokenizer.token()
 switch token.data {
 case "a":
 for _, attr := range token.attr {
  if attr.key == "href" {
  link := attr.val
  parsedlink, parselinkerr := url.parse(link)
  if parselinkerr == nil {
  if isinternal(parsedlink, siteurl, link) {
  scrapedata.internal++
  } else {
  scrapedata.external++
  }
  }
  if parselinkerr != nil {
  fmt.println("can't parse: " + token.data)
  }
  }
 }
 break
 }
 case tt == html.errortoken:
 end = true
 break
 }
 if end {
 break
 }
 }
 data, _ := json.marshal(&scrapedata)
 fmt.println(string(data))
}

下面我們通過容器來構(gòu)建它,并把它部署到生產(chǎn)型的容器鏡像中。

首先構(gòu)建編譯應(yīng)用程序的鏡像:

from golang:1.7.3
workdir /go/src/github.com/sparkdevo/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 .

把上面的內(nèi)容保存到 dockerfile.build 文件中。

接著把構(gòu)建好的應(yīng)用程序部署到生產(chǎn)環(huán)境用的鏡像中:

from alpine:latest 
run apk --no-cache add ca-certificates
workdir /root/
copy app .
cmd ["./app"]

把上面的內(nèi)容保存到 dockerfile 文件中。

最后需要使用一個腳本把整個構(gòu)建過程整合起來:

#!/bin/sh
echo building sparkdevo/href-counter:build
# 構(gòu)建編譯應(yīng)用程序的鏡像
docker build --no-cache -t sparkdevo/href-counter:build . -f dockerfile.build
# 創(chuàng)建應(yīng)用程序
docker create --name extract sparkdevo/href-counter:build
# 拷貝編譯好的應(yīng)用程序
docker cp extract:/go/src/github.com/sparkdevo/href-counter/app ./app
docker rm -f extract

echo building sparkdevo/href-counter:latest
# 構(gòu)建運行應(yīng)用程序的鏡像
docker build --no-cache -t sparkdevo/href-counter:latest .

把上面的內(nèi)容保存到 build.sh 文件中。這個腳本會先創(chuàng)建出一個容器來構(gòu)建應(yīng)用程序,然后再創(chuàng)建最終運行應(yīng)用程序的鏡像。

把 app.go、dockerfile.build、dockerfile 和 build.sh 放在同一個目錄下,然后進入這個目錄執(zhí)行 build.sh 腳本進行構(gòu)建。構(gòu)建后的容器鏡像大小:

Dockerfile中multi-stage怎么構(gòu)建

從上圖中我們可以觀察到,用于編譯應(yīng)用程序的容器鏡像大小接近 700m,而用于生產(chǎn)環(huán)境的容器鏡像只有 10.3 m,這樣的大小在網(wǎng)絡(luò)間傳輸?shù)男适呛芨叩摹?/p>

運行下面的命令可以檢查我們構(gòu)建的容器是否可以正常的工作:

$ docker run -e url=https://www.cnblogs.com/ sparkdevo/href-counter:latest
$ docker run -e url=http://www.cnblogs.com/sparkdev/ sparkdevo/href-counter:latest

Dockerfile中multi-stage怎么構(gòu)建

ok,我們寫的程序正確的統(tǒng)計了博客園首頁和筆者的首頁中超級鏈接的情況。

采用上面的構(gòu)建過程,我們需要維護兩個 dockerfile 文件和一個腳本文件 build.sh。能不能簡化一些呢? 下面我們看看 docker 針對這種情況提供的解決方案:multi-stage。

在 dockerfile 中使用 multi-stage

multi-stage 允許我們在 dockerfile 中完成類似前面 build.sh 腳本中的功能,每個 stage 可以理解為構(gòu)建一個容器鏡像,后面的 stage 可以引用前面 stage 中創(chuàng)建的鏡像。所以我們可以使用下面單個的 dockerfile 文件實現(xiàn)前面的需求:

from golang:1.7.3
workdir /go/src/github.com/sparkdevo/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/sparkdevo/href-counter/app .
cmd ["./app"]

把上面的內(nèi)容保存到文件 dockerfile.multi 中。這個 dockerfile 文件的特點是同時存在多個 from 指令,每個 from 指令代表一個 stage 的開始部分。我們可以把一個 stage 的產(chǎn)物拷貝到另一個 stage 中。本例中的第一個 stage 完成了應(yīng)用程序的構(gòu)建,內(nèi)容和前面的 dockerfile.build 是一樣的。第二個 stage 中的 copy 指令通過 --from=0 引用了第一個 stage ,并把應(yīng)用程序拷貝到了當(dāng)前 stage 中。接下來讓我們編譯新的鏡像:

$ docker build --no-cache -t sparkdevo/href-counter:multi . -f dockerfile.multi

這次使用 href-counter:multi 鏡像運行應(yīng)用:

$ docker run -e url=https://www.cnblogs.com/ sparkdevo/href-counter:multi
$ docker run -e url=http://www.cnblogs.com/sparkdev/ sparkdevo/href-counter:multi

Dockerfile中multi-stage怎么構(gòu)建

結(jié)果和之前是一樣的。那么新生成的鏡像有沒有特別之處呢:

Dockerfile中multi-stage怎么構(gòu)建

好吧,從上圖我們可以看到,除了 sparkdevo/href-counter:multi 鏡像,還生成了一個匿名的鏡像。因此,所謂的 multi-stage 不過時多個 dockerfile 的語法糖罷了。但是這個語法糖還好很誘人的,現(xiàn)在我們維護一個結(jié)構(gòu)簡潔的 dockerfile 文件就可以了!

使用命名的 stage

在上面的例子中我們通過 --from=0 引用了 dockerfile 中第一個 stage,這樣的做法會讓 dockerfile 變得不容易閱讀。其實我們是可以為 stage 命名的,然后就可以通過名稱來引用 stage 了。下面是改造后的 dockerfile.mult 文件:

from golang:1.7.3 as builder
workdir /go/src/github.com/sparkdevo/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/sparkdevo/href-counter/app .
cmd ["./app"]

我們把第一個 stage 使用 as 語法命名為 builder,然后在后面的 stage 中通過名稱 builder 進行引用 --from=builder。通過使用命名的 stage, dockerfile 更容易閱讀了。

“Dockerfile中multi-stage怎么構(gòu)建”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

本文標題:Dockerfile中multi-stage怎么構(gòu)建
網(wǎng)站地址:http://chinadenli.net/article18/ihoggp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護標簽優(yōu)化網(wǎng)站設(shè)計公司軟件開發(fā)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司