匯出二進位制檔案

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

docker build 的預設輸出格式是容器映象。該映象會自動載入到本地映象儲存中,您可以在其中從該映象執行容器,或將其推送到倉庫。在幕後,這使用了預設匯出器,稱為 docker 匯出器。

要將構建結果匯出為檔案,可以使用 local 匯出器。local 匯出器會將構建容器的檔案系統儲存到主機上的指定目錄。

匯出二進位制檔案

要使用 local 匯出器,請將 --output 選項傳遞給 docker build 命令。--output 標誌接受一個引數:要儲存檔案的宿主機的目標位置。

以下命令會將 server 目標中的檔案匯出到宿主檔案系統上的當前工作目錄

$ docker build --output=. --target=server .

執行此命令將在 ./bin/server 建立一個二進位制檔案。它是在 bin/ 目錄下建立的,因為這就是該檔案在構建容器中的位置。

$ ls -l ./bin
total 14576
-rwxr-xr-x  1 user  user  7459368 Apr  6 09:27 server

如果您想要建立一個匯出兩個二進位制檔案的構建,則可以在 Dockerfile 中建立另一個構建階段,從每個構建階段複製這兩個二進位制檔案

  # syntax=docker/dockerfile:1
  ARG GO_VERSION=1.21
  FROM golang:${GO_VERSION}-alpine AS base
  WORKDIR /src
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,source=go.sum,target=go.sum \
      --mount=type=bind,source=go.mod,target=go.mod \
      go mod download -x

  FROM base as build-client
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,target=. \
      go build -o /bin/client ./cmd/client

  FROM base as build-server
  ARG APP_VERSION="0.0.0+unknown"
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,target=. \
      go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server

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

  FROM scratch AS server
  COPY --from=build-server /bin/server /bin/
  ENTRYPOINT [ "/bin/server" ]
+
+ FROM scratch AS binaries
+ COPY --from=build-client /bin/client /
+ COPY --from=build-server /bin/server /

現在可以使用 --output 選項構建 binaries 目標,以匯出客戶端和伺服器二進位制檔案。

$ docker build --output=bin --target=binaries .
$ ls -l ./bin
total 29392
-rwxr-xr-x  1 user  user  7581933 Apr  6 09:33 client
-rwxr-xr-x  1 user  user  7459368 Apr  6 09:33 server

總結

本節演示瞭如何使用 Docker 構建和匯出獨立二進位制檔案。這些二進位制檔案可以自由分發,並且不需要像 Docker 守護程序這樣的容器執行時。

您生成的所有二進位制檔案都是 Linux 二進位制檔案。這是因為構建環境是 Linux。如果您的宿主作業系統是 Linux,則可以執行這些檔案。構建在 Mac 或 Windows 機器上執行的二進位制檔案需要交叉編譯。這將在本指南的後面部分進行介紹。

相關資訊

下一步

本指南的下一個主題是測試:如何使用 Docker 執行應用程式測試。