Docker的`COPY --chmod`可將映象檔案大小減少35%

banq發表於2022-03-27

本週早些時候,我正在編寫一個 Dockerfile 來下載和執行二進位制檔案,這時我注意到映象影像大小遠遠超出了我的預期:

FROM ubuntu:21.10 AS downloader
# Install wget, gnupg; download a zip archive; verify checksum; unzip the binary

FROM ubuntu:21.10
LABEL ...

<p class="indent">[b]COPY --from[/b]=downloader /bin/<binary> /bin/<binary>

RUN apt-get update && apt-get install -y openssl dumb-init iproute2 ca-certificates  \
    && rm -rf /var/lib/apt/lists/* \
    && chmod +x /bin/<binary>
    && mkdir -p <couple of empty directories> \
    && ...
...

`COPY --chmod`在 BuildKit中可用。
 
解釋:如果你把檔案複製到一個容器中,那麼這些檔案就有自己的 "層",類似於它們自己的壓縮檔案。
然後,如果你對所有這些檔案進行`COPY --chmod`,它們將被複制到第二層,並帶有新的訪問修飾符。
當容器執行時解壓映象時,它將把這兩層視為獨立的壓縮檔案,並解壓第一層,然後再解壓第二層,完全覆蓋第一層。
做到這兩點,即在同一層中進行復制和chmod,映象檔案的大小減少了50%,或者在更現實的情況下減少了一點。
這是更明顯的改進之一,儘管由於某些原因很少使用。
  
但是,docker-slim是建立最小且安全的 Docker 映像的方法:
不要浪費時間來嘗試使用 Alpine 基礎映象和靜態編譯複雜的軟體。當 docker-slim 在從映象中刪除作業系統方面做得更好,同時讓您可以使用任何您想要的基礎映象時,這帶來的所有效能、相容性、包可用性問題都不值得。
  
其他提升辦法:按照底部的“變化最大”的順序放置您的步驟。所以:在頂部載入庫,在底部複製程式碼本身。
層在 Dockerfile 中按從上到下的順序進行處理。
如果其中一個發生了變化,那麼所有後續層也將被重建。
因此,永遠不會改變的東西,比如 LABEL 宣告,應該放在第一位,而經常改變的東西,比如你的程式碼,應該放在最後。
 


 

相關文章