Dockerfile 實戰經驗-容器體積最小化

1 基礎鏡像要選好
    FROM scratch 空鏡像,不支持操作系統常用命令,如果希望製作出來的基礎鏡像足夠小,可以基於它按需安裝軟件包.
    基於這個思想,Docker官方爲我們準備了一個可以直接拿來使用的鏡像源  debian:stretch-slim,分析其dockerfile 
    FROM scratch
    ADD rootfs.tar.xz /
    CMD ["bash"]
                    
主要就是在空鏡像的基礎上安裝了一些操作系統常用命令軟件,其中rootfs.tar.xz很精煉,軟件清單可見:    https://raw.githubusercontent.com/debuerreotype/docker-debian-artifacts/42bec5bc2f5a76ceeb125bc4e66d6f70a95e933f/stretch/slim/rootfs.manifest
所以可以直接使用
FROM debian:stretch-slim  來直接獲取體積小且包含最基礎的命令集支持的基礎鏡像 

FROM scratch:stretch  官方預先配置好的容器鏡像,體積會比debian:stretch-slim 大。
    
 
2  儘可能減少軟件包體積
2-1 
# -y:yes,在命令行交互提示中,直接輸入 yes
# –no-install-recommends參數來避免安裝非必須的文件,從而減小鏡像的體積
apt-get install -y --no-install-recommends 

2-2 如果因爲編譯源碼需要,必須安裝一些編譯工具鏈,在編譯工作完成後要及時清理軟件安裝包,依賴包以及相關配置文件
# 刪除軟件及其配置文件
apt-get --purge remove <package>
# 刪除沒用的依賴包
apt-get autoremove <package>
# 此時dpkg的列表中有“rc”狀態的軟件包,其中 rc 狀態的包即卸載了包卻保留了配置文件,可以執行如下命令做最後清理:
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

3 注意安全防護 
3-1 如果將本地源碼COPY到容器內部進行源碼編譯,需要在編譯完成時及時清理源碼文件 

4 注意CMD和ENTRYPOINT的使用  
CMD指令爲ENTRYPOINT指令提供默認參數是基於鏡像層次結構生效的,而不是基於是否在同個Dockerfile文件中。意思就是說,如果Dockerfile指定基礎鏡像中是ENTRYPOINT指定的啓動命令,則該Dockerfile中的CMD依然是爲基礎鏡像中的ENTRYPOINT設置默認參數。
http://www.cnblogs.com/lienhua34/p/5170335.html

所以,當我們製作基礎鏡像的時候,一定要注意ENTRYPOINT 的使用,製作基礎鏡像大多會選擇以CMD爲結尾甚至連CMD都沒有。

5 及時清理無用的文件,減少對容器磁盤空間的佔用。

6 COPY的使用 
6-1 
從鏡像層次結構角度考慮,COPY時,把那些最不容易發生變化的文件的拷貝操作放在較低的鏡像層中,這樣在重新 build 鏡像時就會使用前面 build 產生的緩存,以此來加速鏡像的 build 過程。同時也要注意,COPY操作能合併的儘量合併,減少緩存操作。
6-2 
COPY 命令還支持 Go 風格的通配符
COPY check* /testdir/           # 拷貝所有 check 開頭的文件
COPY check?.log /testdir/       # ? 是單個字符的佔位符,比如匹配文件 check1.log
6-3
對於目錄而言,COPY 和 ADD 命令具有相同的特點:只複製目錄中的內容而不包含目錄自身。
如果想連帶目錄一起復制,需要在目標路徑中指定這個目錄的名稱。

7 保證基礎鏡像的通用性,有針對性的配置或則腳本文件不需要再容器製作是拷貝進去,這樣會增加基礎容器的體積以及破壞基礎鏡像的通用性,可以將
  此類任務留在部署階段完成,如在docker-compose 使用磁盤卷掛載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章