色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

go項目怎么讓docker鏡像體積減小

Linux愛好者 ? 來源:CSDN技術社區 ? 作者:Scoful ? 2022-06-12 15:07 ? 次閱讀

【導讀】go 項目怎么讓 docker 鏡像體積減小?本文做了詳細介紹。

1. 直接編譯得到運行文件 22M

使用的項目源碼地址 (https://github.com/scoful/kingProject)
本地直接編譯打一個linux運行包

setGOOS=linux
setGOARCH=amd64
gobuildmain.go

2e4bbe54-de7e-11ec-ba43-dac502259ad0.png
結果是22M

2. 不編譯直接運行的鏡像 941M

Dockerfile文件內容

#基礎鏡像,基于golang最新鏡像構建
FROMgolang
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR$GOPATH/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY.$GOPATH/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于不編譯打包,源代碼直接運行)
ENTRYPOINT["go","run","main.go"]

編譯鏡像后查詢結果如下:
2e8b729c-de7e-11ec-ba43-dac502259ad0.png
結果是941M,基本跟基礎鏡像golang的大小一致,而且因為沒有預先編譯,等到運行的時候再編譯并拉取依賴包,run起來很慢

3. 編譯后的鏡像 1.14G

Dockerfile文件內容

#基礎鏡像,基于golang最新鏡像構建
FROMgolang
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR$GOPATH/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY.$GOPATH/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯
RUNGOOS=linuxGOARCH=amd64gobuildmain.go
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

2ebd80a2-de7e-11ec-ba43-dac502259ad0.png
結果是1.14G,更大了,因為加上了編譯過程中拉取的包,但是預先編譯,所以直接run,速度很快

4. 優化:使用alpine版本的基礎鏡像 517M

優化的方向:如果一個鏡像在https://hub.docker.com/里能搜到有alpine版本,盡量用alpine版本,相當于是官方提供的最小化可用版本

Dockerfile文件內容

#基礎鏡像,基于golang的alpine版本鏡像構建
FROMgolang:alpine
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR$GOPATH/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY.$GOPATH/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯
RUNGOOS=linuxGOARCH=amd64gobuildmain.go
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

2f090216-de7e-11ec-ba43-dac502259ad0.png
結果是517M,比1.14G減少了650.36M,直接降了56%,而且run一樣很快

5. 再優化:使用多級構建的鏡像 28.4M

再優化的方向:go項目其實只是在build的階段需要go環境,run的時候是不需要的,那build完后go環境用個alpine版本就行

Dockerfile文件內容

#基礎鏡像,基于golang的alpine鏡像構建--編譯階段
FROMgolang:alpineASbuilder
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR/go/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY./go/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯,關閉CGO,防止編譯后的文件有動態鏈接,而alpine鏡像里有些c庫沒有,直接沒有文件的錯誤
RUNGOOS=linuxGOARCH=amd64CGO_ENABLED=0gobuildmain.go

#使用alpine這個輕量級鏡像為基礎鏡像--運行階段
FROMalpineASrunner
#全局工作目錄
WORKDIR/go/kingProject
#復制編譯階段編譯出來的運行文件到目標目錄
COPY--from=builder/go/kingProject/main.
#復制編譯階段里的config文件夾到目標目錄
COPY--from=builder/go/kingProject/config./config
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

2f609cb0-de7e-11ec-ba43-dac502259ad0.png
結果是28.4M,比517M減少了488.6M,再降95%,那個533M是第一級構建生成的

6. 再再優化:使用多級構建+scratch基礎鏡像 22.8M

再再優化的方向:再極端一點,第二級構建的時候用個空鏡像來當基礎鏡像

Dockerfile文件內容

#基礎鏡像,基于golang的alpine鏡像構建--編譯階段
FROMgolang:alpineASbuilder
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR/go/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY./go/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯,關閉CGO,防止編譯后的文件有動態鏈接,而alpine鏡像里有些c庫沒有,直接沒有文件的錯誤
RUNGOOS=linuxGOARCH=amd64CGO_ENABLED=0gobuildmain.go


#使用scratch這個空鏡像為基礎鏡像--運行階段
FROMscratchASrunner
#全局工作目錄
WORKDIR/go/kingProject
#復制編譯階段編譯出來的運行文件到目標目錄
COPY--from=builder/go/kingProject/main.
#復制編譯階段里的config文件夾到目標目錄
COPY--from=builder/go/kingProject/config./config
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

2f7a2306-de7e-11ec-ba43-dac502259ad0.png
結果是22.8M,已經約等于不用鏡像直接編譯出的可執行文件大小了,比28.4M減少了5.6M,再降20%,但用scratch當基礎鏡像的壞處是沒法exec進入容器內部,因為真的就是空鏡像,啥都沒有,啥都不支持

7. 再再再優化:go編譯命令去掉冗余輸出 16.3M

再再再優化的方向:再再極端一點,go編譯的時候,加上參數-ldflags="-w -s",直接去掉一些冗余輸出內容

Dockerfile文件內容

#基礎鏡像,基于golang的alpine鏡像構建--編譯階段
FROMgolang:alpineASbuilder
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR/go/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY./go/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯,關閉CGO,防止編譯后的文件有動態鏈接,而alpine鏡像里有些c庫沒有,直接沒有文件的錯誤
RUNGOOS=linuxGOARCH=amd64CGO_ENABLED=0gobuild-ldflags="-w-s"main.go


#使用scratch這個空鏡像為基礎鏡像--運行階段
FROMscratchASrunner
#全局工作目錄
WORKDIR/go/kingProject
#復制編譯階段編譯出來的運行文件到目標目錄
COPY--from=builder/go/kingProject/main.
#復制編譯階段里的config文件夾到目標目錄
COPY--from=builder/go/kingProject/config./config
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

2f9e1b08-de7e-11ec-ba43-dac502259ad0.png
結果是16.3M,看似比不用鏡像直接編譯出的可執行文件還小,那是因為直接編譯沒有加上這個參數,如果加上大小還是差不多的,比22.8M減少了6.5M,再降29%,好了,降無可降了,用1.14G來對比的話,減少了1.12G,足足降了99%,鵝妹子嚶!

8. 最終版:順便解決時區問題 16.3M

Dockerfile文件內容

#基礎鏡像,基于golang的alpine鏡像構建--編譯階段
FROMgolang:alpineASbuilder
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR/go/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY./go/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯,關閉CGO,防止編譯后的文件有動態鏈接,而alpine鏡像里有些c庫沒有,直接沒有文件的錯誤
RUNGOOS=linuxGOARCH=amd64CGO_ENABLED=0gobuild-ldflags="-w-s"main.go
RUNecho"https://mirrors.aliyun.com/alpine/v3.8/main/">/etc/apk/repositories
&&echo"https://mirrors.aliyun.com/alpine/v3.8/community/">>/etc/apk/repositories
&&apkadd--no-cachetzdata
&&cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime
&&echoAsia/Shanghai>/etc/timezone
&&apkdeltzdata

#使用scratch這個空鏡像為基礎鏡像--運行階段
FROMscratchASrunner
#全局工作目錄
WORKDIR/go/kingProject
#復制編譯階段編譯出來的運行文件到目標目錄
COPY--from=builder/go/kingProject/main.
#復制編譯階段里的config文件夾到目標目錄
COPY--from=builder/go/kingProject/config./config
#復制編譯階段里的時區文件到目標目錄
COPY--from=builder/etc/localtime/etc/localtime
COPY--from=builder/etc/timezone/etc/timezone
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

9. 最最推薦使用版:多級+alpine 21.9M

綜上所述,scratch鏡像有它的缺陷,是一個真的空鏡像,不支持很多命令,比如cp,sh等,如果要進入容器內部查東西,都進不去,不適合真實情況,所以還是推薦alpine鏡像,很小5M多,可以接受。

Dockerfile文件內容

#基礎鏡像,基于golang的alpine鏡像構建--編譯階段
FROMgolang:alpineASbuilder
#作者
MAINTAINERscoful
#全局工作目錄
WORKDIR/go/kingProject
#把運行Dockerfile文件的當前目錄所有文件復制到目標目錄
COPY./go/kingProject
#環境變量
#用于代理下載go項目依賴的包
ENVGOPROXYhttps://goproxy.cn,direct
#編譯,關閉CGO,防止編譯后的文件有動態鏈接,而alpine鏡像里有些c庫沒有,直接沒有文件的錯誤
RUNGOOS=linuxGOARCH=amd64CGO_ENABLED=0gobuild-ldflags="-w-s"main.go


#使用alpine這個輕量級鏡像為基礎鏡像--運行階段
FROMalpineASrunner
#全局工作目錄
WORKDIR/go/kingProject
#復制編譯階段編譯出來的運行文件到目標目錄
COPY--from=builder/go/kingProject/main.
#復制編譯階段里的config文件夾到目標目錄
COPY--from=builder/go/kingProject/config./config
#將時區設置為東八區
RUNecho"https://mirrors.aliyun.com/alpine/v3.8/main/">/etc/apk/repositories
&&echo"https://mirrors.aliyun.com/alpine/v3.8/community/">>/etc/apk/repositories
&&apkadd--no-cachetzdata
&&cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime
&&echoAsia/Shanghai>/etc/timezone
&&apkdeltzdata
#需暴露的端口
EXPOSE8888
#可外掛的目錄
VOLUME["/go/kingProject/config","/go/kingProject/log"]
#dockerrun命令觸發的真實命令(相當于直接運行編譯后的可運行文件)
ENTRYPOINT["./main"]

over,Enjoy!!!

原文標題:給 go 項目打最小 docker 鏡像,足足降低 99%

文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯
    +關注

    關注

    0

    文章

    666

    瀏覽量

    33210
  • 鏡像
    +關注

    關注

    0

    文章

    174

    瀏覽量

    10866
  • Docker
    +關注

    關注

    0

    文章

    495

    瀏覽量

    12182

原文標題:給 go 項目打最小 docker 鏡像,足足降低 99%

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    怎么構建docker鏡像倉庫軟件

    Docker Registry】用docker registry 鏡像搭建私有測試倉庫
    發表于 08-13 11:03

    淺析Docker鏡像本地存儲機制及容器啟動原理

    Docker 鏡像不是一個單一的文件,而是有多層構成。我們可通過 docker images 獲取本地的鏡像列表及對應的元信息, 接著可通過dock
    發表于 10-19 14:17 ?2570次閱讀

    Docker—簡介與鏡像用法

    阿里云官方鏡像站: ??https://developer.aliyun.com/mirror/?utm_content=g_1000303593?? ? 一、容器簡介 Docker是管理容器的引擎
    發表于 11-25 16:28 ?583次閱讀
    <b class='flag-5'>Docker</b>—簡介與<b class='flag-5'>鏡像</b>用法

    go項目怎么docker鏡像體積減小

    go 項目怎么 docker 鏡像體積減小?本文做
    的頭像 發表于 06-23 10:49 ?1266次閱讀

    Docker鏡像的詳細講解

    本文是對 Docker 鏡像的詳細講解,講解了如何安裝 Docker、配置 Docker 鏡像加速以及操作
    的頭像 發表于 08-02 10:00 ?2274次閱讀

    從零開始學習制作、以及使用Tina的Docker編譯鏡像

    學習制作、以及使用Tina的Docker編譯鏡像
    的頭像 發表于 08-28 11:45 ?2450次閱讀
    從零開始學習制作、以及使用Tina的<b class='flag-5'>Docker</b>編譯<b class='flag-5'>鏡像</b>

    減少docker鏡像大小的方法

    Docker 是一種容器引擎,可以在容器內運行一段代碼。Docker 鏡像是在任何地方運行您的應用程序而無需擔心應用程序依賴性的方式。
    的頭像 發表于 05-15 11:13 ?1017次閱讀
    減少<b class='flag-5'>docker</b><b class='flag-5'>鏡像</b>大小的方法

    docker 搜索鏡像,docker查看鏡像詳細信息(docker下載鏡像命令)

    Docker Hub是集中管理的Docker鏡像注冊中心。通過Docker 用戶可以在注冊中心搜索、下載和使用CLI命令行工具中的鏡像。以下
    的頭像 發表于 07-19 09:46 ?2025次閱讀

    Dockerfile定義Docker鏡像的構建過程

    了解Dockerfile Dockerfile 是一個文本文件,用于定義 Docker 鏡像的構建過程。它以指令的形式描述了如何構建鏡像,從基礎鏡像開始逐步添加配置、文件和依賴,最終形
    的頭像 發表于 09-30 10:22 ?2674次閱讀

    構建docker鏡像應該遵循哪些原則

    構建 Docker 鏡像時,應遵循以下原則: 單一職責:每個鏡像應只包含一個應用或服務,避免將多個應用或服務放在同一個鏡像中。這樣可以確保鏡像
    的頭像 發表于 11-23 09:41 ?1172次閱讀

    手動構建Docker鏡像的方法

    不推薦使用docker commit命令,而應該使用更靈活、更強大的dockerfile來構建docker鏡像
    的頭像 發表于 08-05 15:30 ?640次閱讀
    手動構建<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>的方法

    Dockerfile鏡像制作與Docker-Compose容器編排

    Dockerfile鏡像制作 docker/podman中, 鏡像是容器的基礎,每次執行docker run的時候都會指定哪個基本鏡像作為容
    的頭像 發表于 01-07 11:01 ?311次閱讀
    Dockerfile<b class='flag-5'>鏡像</b>制作與<b class='flag-5'>Docker</b>-Compose容器編排

    Docker-鏡像的分層-busybox鏡像制作

    目錄 知識點1:鏡像的分層 示例:進入 docker hub查看Jenkins的Dockerfile 知識點2:base鏡像 知識點3:scratch鏡像 scratch
    的頭像 發表于 01-15 10:44 ?238次閱讀
    <b class='flag-5'>Docker</b>-<b class='flag-5'>鏡像</b>的分層-busybox<b class='flag-5'>鏡像</b>制作

    docker-proxy鏡像加速倉庫

    自建多平臺容器鏡像代理服務,支持 Docker Hub, GitHub, Google, k8s, Quay, Microsoft 等鏡像倉庫。
    的頭像 發表于 03-06 16:06 ?95次閱讀
    <b class='flag-5'>docker</b>-proxy<b class='flag-5'>鏡像</b>加速倉庫

    基于Docker鏡像逆向生成Dockerfile

    在本文中, 我們將通過理解Docker鏡像如何存儲數據, 以及如何使用工具查看鏡像方方面面的信息來逆向工程一個Docker鏡像; 以及如何使
    的頭像 發表于 03-10 09:45 ?70次閱讀
    基于<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>逆向生成Dockerfile
    主站蜘蛛池模板: 精品视频在线观看视频免费视频 | 欧美极限变态扩张video | 亚洲精品色婷婷在线蜜芽 | 国产精品毛片在线视频 | www亚洲欲色成人久久精品 | 午夜aaaa| 伊人大香线蕉精品在线播放 | 国产爱豆果冻传媒在线观看 | 久青草国产观看在线视频 | 亚洲国产成人一区二区在线 | 成年女人免费影院播放 | 久久囯产精品777蜜桃传媒 | 亚洲黄色大片 | 久久久无码精品亚洲A片猫咪 | 国产露脸无码A区久久 | 国产成人一区免费观看 | 中文字幕一区在线观看视频 | 国内精品乱码卡一卡2卡三卡 | 国产久久亚洲美女久久 | 日日摸天天添天天添无码蜜臀 | 蜜臀AV中文字幕熟女人妻 | 九九色精品国偷自产视频 | 久久久精品久久久久久 | 韩国无遮羞禁动漫在线观看 | 99视频精品全部免费免费观 | 久久久久久久久免费视频 | 成人免费视频在线看 | 亚洲日本乱码中文论理在线电影 | 伊人久久大香线蕉观看 | 小草观看免费高清视频 | 息与子在线交尾中文字幕 | 偷偷鲁青春草原视频分类 | 狠狠人妻久久久久久综合九色 | 共妻肉多荤文高h一女n男 | 国产在线精品亚洲二品区 | BL全肉多攻NP高H | 奶头被客人吸得又红又肿 | 99久久亚洲精品影院 | 日韩欧无码一区二区三区免费不卡 | 一二三四在线播放免费观看中文版视频 | 亚洲视频在线观看网站 |