导出Binaries

您知道吗,您可以使用 Docker 将应用程序构建为独立应用程序 Binaries?有时,您不想打包和分发应用程序 作为 Docker 镜像。使用 Docker 构建您的应用程序,并使用导出器来 将输出保存到磁盘。

的默认输出格式docker build是容器镜像。那个形象是 自动加载到本地镜像存储,您可以在其中运行容器 或将其推送到注册表。在后台,这会使用默认的 exporter 调用,称为docker出口商。

要将构建结果导出为文件,您可以使用--output旗 或-o简称。这--outputflag 允许您更改 你的版本。

从构建中导出Binaries

如果指定docker build --outputflag, Docker 导出 将生成容器的内容设置为指定的 location 在主机的文件系统上。这将使用local exporter

这样做的巧妙之处在于,您可以使用 Docker 强大的隔离和 构建功能以创建独立的Binaries。这 适用于 Go、Rust 和其他可以编译为单个 二元的。

下面的示例创建一个简单的 Rust 程序,该程序打印 “Hello, World!“,并将Binaries导出到主机文件系统。

  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 <<EOTsyntax 是一个 here-document。 它允许您在 Dockerfile 中编写多行字符串。这里用于 在 Dockerfile 中内联创建一个简单的 Rust 程序。

    此 Dockerfile 使用多阶段构建来编译第一个 阶段,然后在第二个阶段将Binaries复制到暂存镜像。这 Final Image 是仅包含Binaries的最小 Image。此用例 对于scratchimage 通常用于为 不需要完整作系统即可运行的程序。

  3. 构建 Dockerfile 并将Binaries导出到当前工作目录:

    $ docker build --output=. .
    

    此命令构建 Dockerfile 并将Binaries导出到当前 working 目录中。Binaries名为hello,它是在 当前工作目录。

导出多平台构建

您可以使用localexporter 导出Binaries,以将Binaries与多平台版本结合使用。这让您 一次编译多个Binaries,这些Binaries可以在任何 架构,前提是编译器支持目标平台 你用。

继续 Export binaries from a build 部分中的示例 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"]

您可以使用--platformflag 替换为docker build命令。与--output旗 该版本将每个目标的Binaries导出到指定目录。

例如,要为两者构建程序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

其他信息:

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