婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解六種減小Docker鏡像大小的方法

詳解六種減小Docker鏡像大小的方法

熱門標簽:長沙回撥外呼系統 比較穩定的外呼系統 信貸電銷機器人系統 山東電信外呼系統靠譜嗎 ai電話機器人營銷 鸚鵡螺號航海地圖標注時間 400 電話 申請費用 江蘇自動外呼系統一般多少錢 云南云電銷機器人招商

我從2017年做Vulhub開始,一直在和一個麻煩的問題做斗爭:在編寫Dockerfile的時候, 如何減小 docker build 生成的鏡像大小 ?這篇文章就給大家總結一下我自己使用過的六種減小鏡像大小的方法。

1. 使用Alpine Linux

Alpine Linux是一個基于BusyBox和Musl Libc的Linux發行版,其最大的優勢就是小。一個純的基礎Alpine Docker鏡像在壓縮后僅有2.67MB。

不少Docker官方鏡像都有Alpine版本,比如PHP:

比較之下就可以發現,alpine版本鏡像大小是普通版本的1/5左右。

但是在Docker Hub中,大部分鏡像是沒有Alpine版本的,比如Mysql和PHP-Apache,如果我們需要基于這些環境開發,就不得不自己編寫Alpine版本,或者找一些第三方鏡像。

另外,Alpine的另一個缺點是,其使用了Musl Libc作為傳統的glibc的替代,編譯軟件的時候可能會遇到一些不可預知的問題,這一點會導致我們耗費不少不必要的時間。

2. 只安裝最少的依賴

apt-get、yum、apk等軟件包管理器是我們編譯鏡像時必然需要用到的工具,純凈的Docker基礎鏡像通常會缺少wget、curl、git、gcc等工具,需要我們手工來安裝。

我們以apt為例,apt-get在安裝軟件的時候,可以指定一個選項: --no-install-recommends ,指定這個參數后,有一些非必須的依賴將不會被一起安裝。比如,我們安裝wget時,如果增加這個選項,待安裝的包將從6個減少為3個:

這在一定程度上縮小了鏡像的大小,但這樣做帶來的副作用就是,可能導致目標軟件缺少一些功能。

比如,此時的wget將無法驗證服務器證書的真偽,導致命令出錯:

所以,我們一般的做法是,使用apt時盡量增加 --no-install-recommends ,等后面出現一些錯誤再及時糾正。像wget這種已知的問題,可以提前預判并進行處理:

apt-get install --no-install-recommends wget ca-certificates

3. 為apt擦屁股

某些工具只有編譯階段使用,我不希望它們占用我寶貴的鏡像容量,就可以在鏡像編譯完成后,將這些中間依賴刪掉。

我們以apt為例,在使用完成后,我們需要做的事情有:

  • 刪除那些 不需要 的依賴: apt-get pruge --autoremove ...
  • 刪除本地的軟件包列表: rm -rf /var/lib/apt/lists/*

這個過程中我們會遇到一個非常難解的問題,究竟哪些依賴是“不需要”的?

比如,在編譯PHP時,我們可能會用到三個工具:wget、libxml、gcc。這三個工具,在編譯PHP前都需要安裝。但是在編譯完成后,我們可以卸載wget和gcc,但不能卸載libxml。

原因是,libxml為PHP所依賴的一個動態鏈接庫,如果我們將其卸載,將會出現找不到共享鏈接庫的錯誤:

root@8eab53da8d5b:/# php -v
php: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory

那么,有沒有一個比較方便的辦法,我自動只找出那些不是“共享鏈接庫”的依賴并刪除他們呢?

當然有,比較簡單的辦法是,我們遍歷剛編譯的可執行文件,使用ldd命令列出其依賴的共享鏈接庫文件名,并在源中搜索這個文件名對應的包名:

這些包就是PHP依賴的所有動態鏈接庫,接著我們將這些包用 apt-mark 聲明為“手工安裝的包”,即可阻止 apt purge 的自動卸載。

然后,我們再自動卸載其余沒有用到的包即可。完整shell腳本如下:

find /usr/local -type f -executable -exec ldd '{}' ';' \

 | awk '/=>/ { print $(NF-1) }' \

 | sort -u \

 | xargs -r dpkg-query --search \

 | cut -d: -f1 \

 | sort -u \

 | xargs -r apt-mark manual \

; \

apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false;

4. 盡量將中間依賴的安裝與卸載操作放在一個步驟中

docker鏡像是一個由“層”來堆疊起來的“千層餅”,我們可以使用 docker history <image name> 這條命令來查看任意一個鏡像是由哪些層組成的,以及每一層的大小:

對于Dockerfile來說,這些層的數據都將會被保存在鏡像中,即使后一層刪除了前一層內保存的文件。

比如,我們有如下Dockerfile:

FROM alpine:3.12
RUN truncate -s 50M /sample.dat
RUN rm -rf /sample.dat

我們可以試試看這個鏡像編譯出來有多大,58MB:

相比起來,正常的alpine:3.12只有5.57MB,說明即使我們已經刪除了 /sample.dat 文件,在最后的鏡像中也沒有這個內容,但是它永遠留在了鏡像的history中。

所以,在刪除上文說到的“中間依賴”時,我們需要將安裝、使用、卸載三個部分寫在一個步驟中,才能保證空間被釋放。比如:

FROM debian:buster

RUN apt-get update \

 && apt-get install gcc \

 && gcc ... \

 && apt-get purge --autoremove gcc \

 && rm -rf /var/lib/apt/lists/*

5. 多階段編譯

在Docker 17.05版本以后,新引入了 multi-stage builds 這一概念,這將會極大地簡化我們上述的所有操作。

簡單來說,multi-stage builds支持我們將Docker鏡像的編譯分成多個“階段”。比如常見的軟件編譯的情況,我們可以將編譯階段單獨提出來,軟件編譯完成后直接將二進制文件拷貝到一個新的基礎鏡像中,這樣做最大的好處就是,第二個鏡像不再包含任何編譯階段使用的中間依賴,干干凈凈明明白白。

以最常見的Java項目為例,編譯Jar包的時候,我們需要使用到JDK、Maven等工具,但在實際運行階段,我們只需要JRE環境即可。簡單比較下 maven:3-openjdk-8openjdk:8-jre 兩個鏡像的大小:

差別一倍有余。

以Vulhub中的Shiro 1.2.4環境為例,在其Dockerfile中可以看到兩個 FROM 命令:

FROM maven:3-jdk-8 AS builder

LABEL MAINTAINER="phithon <root@leavesongs.com>"

COPY ./code/ /usr/src/

WORKDIR /usr/src

RUN cd /usr/src; \

 mvn -U clean package -Dmaven.test.skip=true

FROM openjdk:8u102-jre

LABEL MAINTAINER="phithon <root@leavesongs.com>"

COPY --from=builder /usr/src/target/shirodemo-1.0-SNAPSHOT.jar /shirodemo-1.0-SNAPSHOT.jar

EXPOSE 8080

CMD ["java", "-jar", "/shirodemo-1.0-SNAPSHOT.jar"]

第一個 FROM 用來進入 maven:3-jdk-8 環境,使用maven對源碼進行編譯;第二個 FROM 進入較小的 openjdk:8u102-jre 環境,使用 COPY --from= 語法,從前一個階段的編譯結果中將jar文件復制到jre的環境中。

最后,在機器上將會留下兩個鏡像,一個是builder,一個是最終我們需要的那個shiro 1.2.4的環境,后者可以被其他任何用戶獨立使用,而前者可以直接刪除。

對于使用者來說,我們無需再糾結編譯軟件時中間依賴如何刪除才能讓鏡像比較小的問題,反正第一階段使用的任何依賴多不會被遺留到正式的生產環境中。

但多階段編譯對于動態鏈接庫的依賴仍然有上述的問題,如果我們拷貝編譯成果時只拷貝了可執行文件,在新環境下運行仍然會出現找不到共享鏈接庫的錯誤。所以個人覺得,多段式編譯僅適合于Java、golang等能夠跨平臺或靜態編譯的語言,對于C、Python這些依賴較多的項目仍然不友好。

6. 使用slim版本的鏡像

細心的同學可能注意過,Docker官方的Debian鏡像有個slim版本,這個版本的大小比默認的版本要小一倍多:

slim的中文意思就是“苗條的”,顧名思義, debian:stretch-slim 確實苗條的多,原因是其刪除了man文檔等許多不會在容器里用到的文件。

有一些上層的鏡像會基于slim版本的debian進行編寫,比如python。如果我們開發python的項目,可以使用 python:slim 這個基礎鏡像。

總結一下,六種方法,互相不會影響,我們可以同時使用。但第5個,多階段編譯將會是以后的主流方式。

到此這篇關于詳解六種減小Docker鏡像大小的方法的文章就介紹到這了,更多相關減小Docker鏡像大小內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

標簽:運城 烏海 齊齊哈爾 衡陽 拉薩 嘉興 亳州 澳門

巨人網絡通訊聲明:本文標題《詳解六種減小Docker鏡像大小的方法》,本文關鍵詞  詳解,六種,減小,Docker,鏡像,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解六種減小Docker鏡像大小的方法》相關的同類信息!
  • 本頁收集關于詳解六種減小Docker鏡像大小的方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲视频免费在线观看| 国产一区二区在线观看免费| 国产精品乱人伦| 激情六月婷婷久久| 日韩精品一区二区三区老鸭窝| 亚洲人精品一区| 欧美在线免费播放| 一区精品在线播放| 色哟哟精品一区| 亚洲第一综合色| 日韩免费一区二区三区在线播放| 午夜不卡在线视频| 日韩一级高清毛片| 国产老肥熟一区二区三区| 欧美性生交片4| 国产麻豆视频精品| 久久久久9999亚洲精品| 成人app下载| 亚洲一区二区视频| 欧美喷水一区二区| 国产一区二区三区视频在线播放| 国产亚洲一区二区三区在线观看 | 日日骚欧美日韩| 欧美一级艳片视频免费观看| 成人一区二区视频| 五月天亚洲精品| 国产精品水嫩水嫩| 日韩美女在线视频| 欧美人与z0zoxxxx视频| av电影在线观看完整版一区二区| 一区二区三区精品视频| 91精品国产一区二区| 成人av网站免费观看| 日本午夜一本久久久综合| 国产精品乱码一区二区三区软件 | 国产白丝网站精品污在线入口| 国产精品久久午夜| 久久久国产综合精品女国产盗摄| 欧美日韩dvd在线观看| 91久久精品一区二区三| youjizz国产精品| 成人国产一区二区三区精品| 国内精品国产成人国产三级粉色| 丝袜诱惑亚洲看片| 午夜精品久久久久久久久久久| 国产精品福利一区二区| 亚洲视频狠狠干| 欧美精品一区二区久久婷婷| 国产亚洲欧美色| 1000精品久久久久久久久| 亚洲女同女同女同女同女同69| 成人欧美一区二区三区视频网页| 亚洲国产精品精华液ab| 国产精品久久久久影院色老大 | 一区二区三区四区激情| 综合av第一页| 一区二区三区.www| 午夜av电影一区| 毛片av一区二区| 91精彩视频在线| 欧美一级片在线看| 亚洲欧洲韩国日本视频| 视频一区视频二区中文字幕| 久久精品国产99久久6| 91浏览器入口在线观看| 精品国产乱码久久久久久闺蜜| 国产嫩草影院久久久久| 亚洲免费观看在线视频| 国产传媒久久文化传媒| 欧洲一区在线观看| 国产精品人成在线观看免费 | 中文字幕乱码久久午夜不卡 | 欧美国产97人人爽人人喊| 亚洲视频综合在线| 成人晚上爱看视频| 精品免费一区二区三区| 亚洲大型综合色站| 91一区二区三区在线播放| 欧美一级日韩不卡播放免费| 亚洲一二三四久久| av在线这里只有精品| 中文av字幕一区| av高清不卡在线| 国产日韩欧美电影| 国产91露脸合集magnet| 国产午夜精品一区二区三区嫩草 | 热久久免费视频| 91麻豆精品国产综合久久久久久| 亚洲国产精品一区二区尤物区| 欧美性色综合网| 天天综合天天做天天综合| 欧美另类videos死尸| 亚洲午夜在线观看视频在线| 91精品国产色综合久久ai换脸 | 久久综合九色综合欧美亚洲| 奇米色一区二区| 国产精品久久久久四虎| 91丨porny丨在线| 国产一区二区成人久久免费影院 | 亚洲天堂2014| 欧美日韩精品高清| 国产一区欧美日韩| 国产精品国产三级国产aⅴ原创 | 国产精品77777竹菊影视小说| 亚洲欧美日韩国产成人精品影院| 欧美男女性生活在线直播观看| 国产不卡视频在线观看| 久久成人18免费观看| 亚洲成人7777| 午夜a成v人精品| 亚洲成人免费在线观看| 香蕉影视欧美成人| 亚洲不卡一区二区三区| 午夜久久久久久久久| 日韩国产欧美一区二区三区| 午夜精品成人在线| 日韩1区2区日韩1区2区| 老司机精品视频在线| 午夜不卡av在线| 日韩高清不卡一区二区三区| 综合激情网...| 亚洲午夜久久久久中文字幕久| 午夜私人影院久久久久| 久久国内精品视频| 免费在线观看日韩欧美| 国产精品美日韩| 国产精品国产a| 18欧美亚洲精品| 免费在线视频一区| 波多野结衣亚洲一区| 欧美日韩亚洲高清一区二区| 久久影视一区二区| 亚洲精品成a人| 国产一区二区不卡| 欧美一级二级三级蜜桃| 亚洲人成网站影音先锋播放| 国内精品自线一区二区三区视频| 色欧美片视频在线观看在线视频| 日韩一区二区三区在线| 亚洲蜜臀av乱码久久精品蜜桃| 紧缚奴在线一区二区三区| 欧美精品色综合| 五月综合激情日本mⅴ| 91视视频在线直接观看在线看网页在线看 | 久久久国产精品不卡| 日韩精品亚洲一区| 欧美在线免费观看视频| 一区在线播放视频| 色88888久久久久久影院野外| 1024成人网色www| 欧美日韩国产欧美日美国产精品| 亚洲国产日韩一级| 日韩欧美电影一二三| 国产精品自拍一区| 国产精品久久久久久久久动漫| 9久草视频在线视频精品| 亚洲激情图片qvod| 欧美成人艳星乳罩| 成人黄色综合网站| 亚洲国产日韩综合久久精品| 日韩精品自拍偷拍| 成人高清视频在线观看| 亚洲愉拍自拍另类高清精品| 日韩视频一区二区| 成人看片黄a免费看在线| 亚洲免费av网站| 精品国产乱码久久久久久久久 | 亚洲大片在线观看| 91精品国产综合久久精品| 天堂av在线一区| 亚洲国产精品成人综合色在线婷婷| 91亚洲永久精品| 一区二区三区色| 在线播放国产精品二区一二区四区 | 亚洲精品国产无天堂网2021 | 在线视频国产一区| 狠狠色丁香久久婷婷综合丁香| 中文av一区特黄| 日韩欧美电影在线| 制服丝袜亚洲播放| 欧美日韩国产高清一区二区三区 | 精品国产免费人成在线观看| 91国偷自产一区二区开放时间 | 久久亚洲一区二区三区四区| 在线观看三级视频欧美| 99久久伊人久久99| 91视频国产观看| 欧美色视频一区| 精品视频一区二区不卡| 欧美日韩视频在线一区二区| 欧美日韩大陆在线| 精品国产欧美一区二区| 国产亚洲精品福利| 综合电影一区二区三区| 午夜不卡在线视频| 国内精品在线播放| 成人毛片老司机大片| 欧美日韩国产大片| 国产亚洲女人久久久久毛片| 亚洲三级免费观看|