相信自己的微型 Docker 映像*

[參考美國兒童童話《可以的小引擎》 - 約。 車道]*

相信自己的微型 Docker 映像*

如何根據您的需求自動建立小型 Docker 映像

不尋常的痴迷

在過去的幾個月裡,我一直沉迷於一個問題:Docker 映像可以有多小,並且應用程式仍然可以運行?

我明白,這個想法很奇怪。

在討論細節和技術細節之前,我想先解釋為什麼這個問題讓我如此困擾,以及它與您有何關係。

為什麼尺寸很重要

透過減少 Docker 映像的內容,我們從而減少了漏洞列表。 此外,我們使圖像更清晰,因為它們僅包含運行應用程式所需的內容。

還有一個小優點 - 圖像下載速度稍快一些,但是,在我看來,這並不是那麼重要。

請注意:如果您擔心尺寸,Alpine 外觀本身較小,可能適合您。

無 Distroless 圖像

Distroless 項目 提供了一系列基本的「distroless」映像,它們不包含套件管理器、shell 和您習慣在命令列上看到的其他實用程式。 因此,使用套件管理器,例如 pip и apt 不管用:

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

使用 Python 3 distroless 映像檔的 Dockerfile

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Step 2/2 : RUN  pip3 install numpy
 ---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found

影像中沒有 Pip

通常這個問題可以透過多階段建構來解決:

FROM python:3 as builder
RUN  pip3 install numpy

FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/

多階段組裝

結果是大小為 130MB 的圖像。 還不錯! 作為比較:預設的 Python 鏡像大小為 929MB,「較薄」的鏡像大小 (3,7-slim) - 179MB,高山影像 (3,7-alpine)為 98,6MB,而範例中使用的基本 distroless 映像為 50,9MB。

公平地說,在前面的範例中,我們正在複製整個目錄 /usr/local/lib/python3.7/site-packages,其中可能包含我們不需要的依賴項。 儘管很明顯,所有現有Python基礎鏡像的大小差異各不相同。

在撰寫本文時,Google distroless 不支援許多圖像:Java 和 Python 仍處於實驗階段,Python 僅存在於 2,7 和 3,5 版本。

微小的影像

回到我對創建小圖像的痴迷。

總的來說,我想看看 distroless 圖像是如何建構的。 distroless 專案使用 Google 的建置工具 bazel。 然而,安裝 Bazel 並編寫自己的鏡像需要做很多工作(說實話,重新發明輪子既有趣又具有教育意義)。 我想簡化較小圖像的創建:創建圖像的行為應該非常簡單, 平庸的。 這樣就不需要您的設定文件,只需在控制台中輸入一行: просто собрать образ для <приложение>.

所以,如果你想創建自己的映像,那麼就知道:有這樣一個獨特的 docker 映像, scratch。 Scratch 是一個“空”圖像,其中沒有文件,儘管默認情況下它的重量 - 哇! - 77 位元組。

FROM scratch

刮痕影像

臨時映像的想法是,您可以將任何依賴項從主機複製到其中,然後在 Dockerfile 中使用它們(這就像將它們複製到 apt 並從頭開始安裝),或稍後在 Docker 映像實作後安裝。 這可以讓你完全控制Docker容器的內容,從而完全控制鏡像的大小。

現在我們需要以某種方式收集這些依賴項。 現有的工具如 apt 允許你下載軟體包,但它們與當前機器綁定,畢竟不支援 Windows 或 MacOS。

因此,我開始建立自己的工具,該工具可以自動建立盡可能最小尺寸的基礎映像並運行任何應用程式。 我使用 Ubuntu/Debian 軟體包,進行選擇(直接從儲存庫取得軟體包)並遞歸地找到它們的依賴項。 該程式應該自動下載最新的穩定版本的軟體包,盡可能地降低安全風險。

我給這個工具取了個名字 fetchy,因為他...找到並帶來...需要的東西[源自英語“取”,“帶來” - 大約。 車道]。 該工具透過命令列介面工作,但同時提供 API。

使用以下方式組裝影像 fetchy (這次我們使用Python圖像),你只需要像這樣使用CLI: fetchy dockerize python。 可能會要求您提供目標作業系統和代號,因為 fetchy 目前僅使用基於 Debian 和 Ubuntu 的軟體包。

現在您可以選擇根本不需要哪些依賴項(在我們的上下文中)並將其排除。 例如,Python 依賴 perl,儘管在沒有安裝 Perl 的情況下它也能正常工作。

Результаты

使用命令創建的Python圖像 fetchy dockerize python3.5 重量僅為 35MB(我非常確定將來它可以做得更輕)。 事實證明,我們成功地從 distroless 鏡像中又削減了 15 個 WW。

您可以看到迄今為止收集的所有圖像 這裡.

專案 - 這裡.

如果您缺少功能,只需建立一個請求 - 我很樂意提供協助:)更重要的是,我目前正在努力將其他套件管理器整合到 fetchy 中,以便不需要多階段建置。

來源: www.habr.com

添加評論