日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Dockerfile多阶段构建

發布時間:2025/6/17 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dockerfile多阶段构建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多階段構建 之前的做法:在Docker17.05版本之前,構建Docker鏡像,通常采用兩種方式:1.全部放入一個Dockerfile一種方式是將所有的構建過程全都包含在一個Dockerfile中,包括項目及其依賴庫的編譯、測試、打包流程,這里會帶來的一些問題:鏡像層次多,鏡像體積較大,部署時間變長源代碼存在泄漏的風險例如,編寫app.go文件,輸出Hello World!package main import "fmt" func main(){fmt.Printf("Hello World!"); }編寫Dockerfile.one文件FROM golang:1.9-alpine RUN apk --no-cache add git ca-certificates WORKDIR /go/src/github.com/go/helloworld/ COPY app.go . RUN go get -d -v github.com/go-sql-driver/mysql \ && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . \ && cp /go/src/github.com/go/helloworld/app /root WORKDIR /root/ CMD ["./app"]構建上面的鏡像docker build -t go/helloworld:1 -f Dockerfile.one .構建完之后查下 docker image ls輸出: REPOSITORY TAG IMAGE ID CREATED SIZE go/helloworld 1 abdac4fc2d71 18 seconds ago 260MB啟動 docker run abdac4fc2d71 ,輸出 Hello World! ,說明沒問題。2.第二種方式就是分散到多個Dockerfile 事先在一個Dockerfile將項目及其依賴庫編譯測試打包好后,再將其拷貝到運行環境中,這種方式需要編寫兩個Dockerfile和一些編譯腳本才能將其兩個階段自動整合起來,這種方式雖然可以很好的規避第一種方式存在的風險,但明顯部署過程復雜。例子: app.go文件 -------------------------- package main import "fmt" func main(){fmt.Printf("Hello World!"); }Dockerfile.build 文件 -------------------------- FROM golang:1.9-alpine RUN apk --no-cache add git WORKDIR /go/src/github.com/go/helloworld COPY app.go . RUN go get -d -v github.com/go-sql-driver/mysql \ && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .Dockerfile.copy 文件 -------------------------- FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY app . CMD ["./app"]build.sh 文件 -------------------------- echo Building go/helloworld:build docker build -t go/helloworld:build . -f Dockerfile.build docker create --name extract go/helloworld:build docker cp extract:/go/src/github.com/go/helloworld/app ./app docker rm -f extract echo Building go/helloworld:2 docker build --no-cache -t go/helloworld:2 . -f Dockerfile.copy rm ./app 54 /然后執行build.sh 這個腳本 加個執行權限 chmod +x build.sh ./build.shPS:如果是windows環境下創建的build.sh這個文件的話,直接放到linux上會有問題,報錯會是說XXX文件路徑不存在,我的這個就是,最簡答的處理方法就是 用vim打開build.sh這個文件,然后執行:set fileformat=unix 然后再 wq 保存退出就行了。看下鏡像 docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE go/helloworld 2 411821efb026 4 minutes ago 7.97MB go/helloworld build e43c3b88e2c2 4 minutes ago 258MB go/helloworld 1 abdac4fc2d71 2 hours ago 260MB ubuntu 18.04 775349758637 4 weeks ago 64.2MB alpine latest 965ea09ff2eb 5 weeks ago 5.55MB hello-world latest fce289e99eb9 11 months ago 1.84kB golang 1.9-alpine b0260be938c6 15 months ago 240MB最上面的那個就是了,可以跑下試試:docker run 411821efb026 可以輸出Hello World!上面就是兩種之前的創建鏡像的方式,接下來的筆記是關于 多階段構建的 Docker v17.05之后開始支持多階段構建(multistage builds)Dockerfile 文件 FROM golang:1.9-alpine as builder RUN apk --no-cache add git WORKDIR /go/src/github.com/go/helloworld/ RUN go get -d -v github.com/go-sql-driver/mysql COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o a pp . FROM alpine:latest as prod RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=0 /go/src/github.com/go/helloworld/app . CMD ["./app"]開始構建 docker build -t go/helloworld:3 . 跑下試試:docker run 0186e09ebd69 可以跑出來Hello World!對比下體積看看 docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE go/helloworld 3 0186e09ebd69 36 seconds ago 7.97MB go/helloworld 2 411821efb026 55 minutes ago 7.97MB go/helloworld build e43c3b88e2c2 55 minutes ago 258MB go/helloworld 1 abdac4fc2d71 3 hours ago 260MBTAG為3的這個鏡像非常小。只構建某一階段的鏡像 使用 as 來為某一階段命名,例如 FROM golang:1.9-alpine as builder 如當只想構建 builder 階段的鏡像時,增加 --target=builder 參數即可 docker build --target builder -t username/imagename:tag .構建時從其他鏡像復制文件 使用 COPY --from=0 例子: COPY --from=0 /go/src/github.com/go/helloworld/app . COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

?

總結

以上是生活随笔為你收集整理的Dockerfile多阶段构建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。