导出二进制文件
您知道可以使用 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 运行应用程序测试。