导出二进制文件

您知道可以使用 Docker 将您的应用程序构建为独立的二进制文件吗?有时,您不希望将应用程序打包和分发为 Docker 镜像。使用 Docker 构建您的应用程序,并使用导出器将输出保存到磁盘。

docker build 的默认输出格式是容器镜像。该镜像会自动加载到您的本地镜像存储中,您可以从中运行容器,或将其推送到注册表。实际上,这使用的是默认导出器,称为 docker 导出器。

要将构建结果导出为文件,可以使用 --output 标志,或简写为 -o--output 标志允许您更改构建的输出格式。

从构建中导出二进制文件

如果您为 docker build --output 标志指定文件路径,Docker 会在构建结束时将构建容器的内容导出到主机文件系统上的指定位置。这使用 local 导出器

这样做的好处是,您可以使用 Docker 强大的隔离和构建功能来创建独立的二进制文件。这对于 Go、Rust 和其他可以编译成单个二进制文件的语言非常有效。

以下示例创建了一个简单的 Rust 程序,它打印“Hello, World!”,并将二进制文件导出到主机文件系统。

  1. 为本示例创建一个新目录,并导航到该目录

    $ mkdir hello-world-bin
    $ cd hello-world-bin
    
  2. 创建一个包含以下内容的 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 镜像的这种用法常用于为不需要完整操作系统即可运行的程序创建最小构建产物。

  3. 构建 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/amd64linux/arm64 构建程序

$ docker build --platform=linux/amd64,linux/arm64 --output=out .
$ tree out/
out/
├── linux_amd64
│   └── hello
└── linux_arm64
    └── hello

3 directories, 2 files

附加信息

除了 local 导出器,还有其他可用的导出器。要了解有关可用导出器及其使用方法的更多信息,请参阅导出器文档。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.