Docker 映像檔採用分層唯讀檔案系統 (Union FS),所有寫入操作僅發生在最上層可寫層。建立自訂基礎映像 (Base Image) 能讓團隊擁有標準化、無外部依賴的運行環境。本文詳細介紹兩種主流建立方式:Tar 打包現有 Linux 發行版 與 從 Scratch 空白映像構建。



debootstrap (Debian/Ubuntu 內建)sudo 權限# 1. 建立最小化 Ubuntu Trusty 根目錄
sudo debootstrap trusty trusty > /dev/null
# 2. 打包並匯入 Docker (映像名稱為 trusty)
sudo tar -C trusty -c . | sudo docker import - trusty
# 3. 驗證映像
docker run trusty cat /etc/lsb-release
# 預期輸出:
# DISTRIB_ID=Ubuntu
# DISTRIB_RELEASE=14.04
# DISTRIB_CODENAME=trusty
# DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"
tar -C trusty -c .:將 trusty/ 目錄內容打包輸出到 STDOUTdocker import - trusty:從 STDIN 讀取 tar 流並建立名為 trusty 的映像# 手動建立空白映像 (教學用)
tar cv --files-from /dev/null | docker import - scratch
FROM scratch
ADD script.sh /usr/local/bin/run.sh
CMD ["/usr/local/bin/run.sh"]
docker build -t my-minimal-app .
docker run my-minimal-app
# 容器啟動即執行 /usr/local/bin/run.sh,無任何 OS 基礎設施
| 維度 | Tar + 發行版 | Scratch + 靜態二進位 |
|---|---|---|
| 映像大小 | ~100-200 MB | < 5 MB (僅二進位大小) |
| 內含工具 | 完整套件管理、Shell、核心工具 | 無 Shell、無 ldd、無 ca-certificates |
| 適用場景 | 需互動除錯、安裝套件、動態連結程式 | Go/Rust 靜態編譯微服務、極致壓縮部署 |
| 維護成本 | 需定期更新基礎映像修補 CVE | 極低,但缺乏標準工具鏈 |
# 建置階段
FROM golang:1.21 AS builder
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app
# 運行階段
FROM scratch
COPY --from=builder /app /app
ENTRYPOINT ["/app"]
結合 scratch 與多階段建置,可同時享有完整建置環境與極簡運行映像的優勢。
contrib/mkimage.sh 系列腳本 (支援 Debian、Ubuntu、CentOS、BusyBox 等)scratch 映像說明掌握這兩種建立基礎映像的方法,即可根據專案需求靈活選擇:完整 OS 環境或極簡靜態部署。