基礎映像檔

所有 Dockerfile 都從基礎映像檔開始。基礎是您的映像檔擴充的映像檔。它指的是 Dockerfile 中 FROM 指令的內容。

FROM debian

在大多數情況下,您不需要建立自己的基礎映像檔。Docker Hub 包含一個龐大的 Docker 映像檔庫,適用於在您的建置中作為基礎映像檔使用。Docker 官方映像檔 是專門設計的一組強化、經過實戰測試的映像檔,支援各種平台、語言和框架。還有 Docker 認證發行商建立基礎映像檔

如果您需要完全控制映像檔的內容,您可以從您選擇的 Linux 發行版建立自己的基礎映像檔,或使用特殊的 FROM scratch 基礎。

scratch 映像檔通常用於建立僅包含應用程式所需內容的最小映像檔。請參閱 使用 scratch 建立最小的基礎映像檔

要建立發行版基礎映像檔,您可以使用封裝為 tar 檔案的根檔案系統,並使用 docker import 將其匯入 Docker。建立您自己的基礎映像檔的流程取決於您要封裝的 Linux 發行版。請參閱 使用 tar 建立完整映像檔

使用 scratch 建立最小的基礎映像檔

保留的最小 scratch 映像檔作為建置容器的起點。使用 scratch 映像檔向建置流程發出訊號,表示您希望 Dockerfile 中的下一個命令是映像檔中的第一個檔案系統層。

雖然 scratch 出現在 Docker 的 Docker Hub 上的儲存庫

假設名為 hello 的可執行二進位檔存在於 建置上下文 的根目錄。您可以使用以下 docker build 命令建置此 Docker 映像檔

$ docker build --tag hello .

要執行您的新映像檔,請使用 docker run 命令

$ docker run --rm hello

只要 hello 二進位檔沒有任何執行階段相依性,此範例映像檔就可以成功執行。電腦程式通常依賴於執行階段環境中存在的某些其他程式或資源。例如

建置基礎映像檔或任何映像檔時,這是要考慮的重要層面。這就是為什麼使用 FROM scratch 建立基礎映像檔可能很困難,除了小型、簡單的程式之外。另一方面,僅在映像檔中包含您需要的內容也很重要,以減少映像檔大小和攻擊面。

使用 tar 建立完整映像檔

一般來說,先準備一台運作中的機器,上面執行您想要打包成基礎映像檔的發行版本,雖然某些工具(例如 Debian 的 Debootstrap)並不需要這樣做,您也可以使用它來建置 Ubuntu 映像檔。

例如,要建立一個 Ubuntu 基礎映像檔

$ sudo debootstrap focal focal > /dev/null
$ sudo tar -C focal -c . | docker import - focal

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run focal cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"

Moby GitHub 儲存庫 中有更多建立基礎映像檔的範例腳本。

更多資源

有關建置映像檔和撰寫 Dockerfiles 的更多資訊,請參閱