匯出二進位制檔案
您知道可以使用 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 執行應用程式測試。