基礎映像
所有的 Dockerfile 都從基礎映像檔開始。基礎映像檔是您的映像檔所延伸(extend)的對象。它對應到 Dockerfile 中 FROM 指令的內容。
FROM debian在大多數情況下,您不需要建立自己的基礎映像檔。Docker Hub 包含龐大的 Docker 映像檔庫,適合用作建置時的基礎映像檔。Docker 官方映像檔 (Docker Official Images) 具有清晰的文件、推廣最佳實踐,並定期更新。此外還有 Docker 驗證發布者 (Docker Verified Publisher) 映像檔,由受信任的發布合作夥伴建立,並經由 Docker 驗證。
建立基礎映像檔
如果您需要完全控制映像檔的內容,可以從您選擇的 Linux 發行版建立自己的基礎映像檔,或者使用特殊的 FROM scratch 基礎。
FROM scratchscratch 映像檔通常用於建立僅包含應用程式所需內容的最小化映像檔。請參閱 使用 scratch 建立最小化的基礎映像檔。
若要建立發行版基礎映像檔,您可以使用封裝為 tar 檔案的根檔案系統,並使用 docker import 將其匯入 Docker。建立自有基礎映像檔的流程取決於您想要封裝的 Linux 發行版。請參閱 使用 tar 建立完整映像檔。
使用 scratch 建立最小化的基礎映像檔
被保留的最小化 scratch 映像檔是建置容器的起點。使用 scratch 映像檔向建置程序發出訊號,表示您希望 Dockerfile 中的下一個指令成為映像檔中的第一個檔案系統層。
雖然 scratch 出現在 Docker 的 Docker Hub 儲存庫中,但您無法 pull 它、執行它,或將任何映像檔標記為 scratch。相反地,您可以在 Dockerfile 中參照它。例如,若要使用 scratch 建立最小化的容器:
# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]假設 建置內容 (build context) 的根目錄中存在一個名為 hello 的可執行二進位檔。您可以使用下列 docker build 指令來建置此 Docker 映像檔:
$ docker build --tag hello .
若要執行您的新映像檔,請使用 docker run 指令:
$ docker run --rm hello
此範例映像檔只有在 hello 二進位檔沒有任何執行階段相依性時才能成功執行。電腦程式往往依賴於執行環境中存在的其他特定程式或資源。例如:
- 程式語言執行階段 (Programming language runtimes)
- 動態連結的 C 函式庫 (Dynamically linked C libraries)
- 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 的更多資訊,請參閱: