匯出二進位制檔案
您知道可以使用 Docker 將您的應用程式構建為獨立的二進位制檔案嗎?有時,您不希望將應用程式打包和分發為 Docker 映象。使用 Docker 構建您的應用程式,並使用匯出器將輸出儲存到磁碟。
docker build
的預設輸出格式是容器映象。該映象會自動載入到您的本地映象儲存中,您可以從中執行容器,或將其推送到登錄檔。實際上,這使用的是預設匯出器,稱為 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 <<EOT
語法是一種 here-document。它允許您在 Dockerfile 中編寫多行字串。在這裡,它用於在 Dockerfile 中內聯建立一個簡單的 Rust 程式。這個 Dockerfile 使用多階段構建,在第一階段編譯程式,然後將二進位制檔案複製到第二階段的空白映象中。最終映象是一個只包含二進位制檔案的最小映象。
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
匯出器,還有其他可用的匯出器。要了解有關可用匯出器及其使用方法的更多資訊,請參閱匯出器文件。