基礎映象

所有 Dockerfile 都始於一個基礎映象。基礎映象是你的映象所擴充套件的映象。它指的是 Dockerfile 中 `FROM` 指令的內容。

FROM debian

在大多數情況下,你不需要建立自己的基礎映象。Docker Hub 包含一個龐大的 Docker 映象庫,適合用作你構建中的基礎映象。Docker 官方映象有清晰的文件,推廣最佳實踐,並定期更新。還有由受信任的釋出合作伙伴建立並經 Docker 驗證的Docker 驗證釋出者映象。

建立基礎映象

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

FROM scratch

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

要建立發行版基礎映象,你可以使用打包為 `tar` 檔案的根檔案系統,並使用 `docker import` 將其匯入 Docker。建立你自己的基礎映象的過程取決於你想要打包的 Linux 發行版。請參閱使用 tar 建立完整映象

使用 scratch 建立最小化基礎映象

保留的最小 `scratch` 映象作為構建容器的起點。使用 `scratch` 映象向構建過程發出訊號,表明你希望 `Dockerfile` 中的下一個命令是映象中的第一個檔案系統層。

雖然 `scratch` 出現在 Docker 的Docker Hub 儲存庫中,但你無法拉取它、執行它或用 `scratch` 這個名字標記任何映象。相反,你可以在 `Dockerfile` 中引用它。例如,要使用 `scratch` 建立一個最小化容器:

# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]

假設在構建上下文的根目錄下存在一個名為 `hello` 的可執行二進位制檔案。你可以使用以下 `docker build` 命令構建此 Docker 映象:

$ docker build --tag hello .

要執行你的新映象,請使用 `docker run` 命令:

$ docker run --rm hello

只要 `hello` 二進位制檔案沒有任何執行時依賴,這個示例映象就可以成功執行。計算機程式往往依賴於執行時環境中存在的某些其他程式或資源。例如:

  • 程式語言執行時
  • 動態連結的 C 庫
  • CA 證書

在構建基礎映象或任何映象時,這是一個需要考慮的重要方面。這也是為什麼除了小型、簡單的程式之外,使用 `FROM scratch` 建立基礎映象可能很困難的原因。另一方面,在映象中只包含你需要的東西也很重要,以減小映象大小和攻擊面。

使用 tar 建立完整映象

通常,從執行你想要打包為基礎映象的發行版的工作機器開始,儘管對於某些工具(如 Debian 的Debootstrap,你也可以用它來構建 Ubuntu 映象)來說並非必需。

例如,要建立 Ubuntu 基礎映象:

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

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run noble cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"

Moby GitHub 儲存庫中有更多建立基礎映象的示例指令碼。

更多資源

有關構建映象和編寫 Dockerfile 的更多資訊,請參閱: