匯出二進位檔
您知道嗎?您可以使用 Docker 將應用程式建構為獨立的二進位檔案。有時候,您可能不想將應用程式封裝並發布為 Docker 映像檔。這時可以使用 Docker 來建構您的應用程式,並利用匯出器 (exporters) 將輸出內容儲存到磁碟中。
docker build 的預設輸出格式為容器映像檔。該映像檔會自動載入到您的本機映像檔存放區,您可以從該映像檔執行容器,或將其推送到登錄檔 (registry)。底層運作上,這是使用稱為 docker 匯出器的預設匯出器。
若要改為將建構結果匯出為檔案,您可以使用 --output 旗標(簡寫為 -o)。--output 旗標可讓您變更建構的輸出格式。
從建構過程中匯出二進位檔案
如果您為 docker build --output 旗標指定檔案路徑,Docker 會在建構結束時,將建構容器內的內容匯出至主機檔案系統的指定位置。此操作使用的是 local 匯出器。
最棒的是,您可以利用 Docker 強大的隔離與建構功能來建立獨立的二進位檔案。這對於 Go、Rust 以及其他可編譯為單一二進位檔的語言來說非常適用。
以下範例將建立一個簡單的 Rust 程式,該程式會印出「Hello, World!」,並將二進位檔案匯出到主機檔案系統。
為此範例建立一個新目錄,並進入該目錄:
$ mkdir hello-world-bin $ cd hello-world-bin建立一個包含以下內容的 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映像檔的使用方式在建立極簡建構產物時非常常見。建構 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/amd64 和 linux/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) 文件。