匯出二進位制檔案

您知道可以使用 Docker 將您的應用程式構建為獨立的二進位制檔案嗎?有時,您不希望將應用程式打包和分發為 Docker 映象。使用 Docker 構建您的應用程式,並使用匯出器將輸出儲存到磁碟。

docker build 的預設輸出格式是容器映象。該映象會自動載入到您的本地映象儲存中,您可以從中執行容器,或將其推送到登錄檔。實際上,這使用的是預設匯出器,稱為 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 <<EOT 語法是一種 here-document。它允許您在 Dockerfile 中編寫多行字串。在這裡,它用於在 Dockerfile 中內聯建立一個簡單的 Rust 程式。

    這個 Dockerfile 使用多階段構建,在第一階段編譯程式,然後將二進位制檔案複製到第二階段的空白映象中。最終映象是一個只包含二進位制檔案的最小映象。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 匯出器,還有其他可用的匯出器。要了解有關可用匯出器及其使用方法的更多資訊,請參閱匯出器文件。