匯出二進位檔

您知道嗎?您可以使用 Docker 將應用程式建構為獨立的二進位檔案。有時候,您可能不想將應用程式封裝並發布為 Docker 映像檔。這時可以使用 Docker 來建構您的應用程式,並利用匯出器 (exporters) 將輸出內容儲存到磁碟中。

docker build 的預設輸出格式為容器映像檔。該映像檔會自動載入到您的本機映像檔存放區,您可以從該映像檔執行容器,或將其推送到登錄檔 (registry)。底層運作上,這是使用稱為 docker 匯出器的預設匯出器。

若要改為將建構結果匯出為檔案,您可以使用 --output 旗標(簡寫為 -o)。--output 旗標可讓您變更建構的輸出格式。

從建構過程中匯出二進位檔案

如果您為 docker build --output 旗標指定檔案路徑,Docker 會在建構結束時,將建構容器內的內容匯出至主機檔案系統的指定位置。此操作使用的是 local 匯出器

最棒的是,您可以利用 Docker 強大的隔離與建構功能來建立獨立的二進位檔案。這對於 Go、Rust 以及其他可編譯為單一二進位檔的語言來說非常適用。

以下範例將建立一個簡單的 Rust 程式,該程式會印出「Hello, World!」,並將二進位檔案匯出到主機檔案系統。

  1. 為此範例建立一個新目錄,並進入該目錄:

    $ mkdir hello-world-bin
    $ cd hello-world-bin
    
  2. 建立一個包含以下內容的 Dockerfile:

    # syntax=docker/dockerfile:1
    FROM rust:alpine AS build
    WORKDIR /src
    COPY <<EOT hello.rs
    fn main() {
        println!("Hello World!");
    }
    EOT
    RUN rustc -o /bin/hello hello.rs
    
    FROM scratch
    COPY --from=build /bin/hello /
    ENTRYPOINT ["/hello"]
    提示

    COPY < 語法是 here-document。它允許您在 Dockerfile 中編寫多行字串。在此範例中,它被用於直接在 Dockerfile 內建立一個簡單的 Rust 程式。

    此 Dockerfile 使用了多階段建構 (multi-stage build),在第一階段編譯程式,然後在第二階段將二進位檔案複製到 scratch 映像檔中。最終生成的映像檔是一個極簡的映像檔,僅包含該二進位檔案。對於那些不需要完整作業系統即可執行的程式,這種 scratch 映像檔的使用方式在建立極簡建構產物時非常常見。

  3. 建構 Dockerfile 並將二進位檔案匯出到目前的工作目錄:

    $ docker build --output=. .
    

    此指令會建構 Dockerfile 並將二進位檔案匯出至目前的工作目錄。二進位檔案名稱為 hello,並會建立在目前的工作目錄中。

匯出跨平台建構結果

您可以將 local 匯出器與 跨平台建構 結合使用來匯出二進位檔案。這讓您可以一次編譯多個二進位檔案,這些檔案可以在任何架構的機器上執行,前提是所使用的編譯器支援該目標平台。

延續 從建構過程中匯出二進位檔案 章節中的範例 Dockerfile:

# syntax=docker/dockerfile:1
FROM rust:alpine AS build
WORKDIR /src
COPY <<EOT hello.rs
fn main() {
    println!("Hello World!");
}
EOT
RUN rustc -o /bin/hello hello.rs

FROM scratch
COPY --from=build /bin/hello /
ENTRYPOINT ["/hello"]

您可以透過在 docker build 指令中使用 --platform 旗標,為多個平台建構此 Rust 程式。配合 --output 旗標,建構過程會將每個目標平台的二進位檔案匯出至指定目錄。

例如,要同時為 linux/amd64linux/arm64 建構程式:

$ docker build --platform=linux/amd64,linux/arm64 --output=out .
$ tree out/
out/
├── linux_amd64
│   └── hello
└── linux_arm64
    └── hello

3 directories, 2 files

補充資訊

除了 local 匯出器之外,還有其他可用的匯出器。若要深入了解可用的匯出器及其使用方法,請參閱 匯出器 (exporters) 文件。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.