为你的 C++ 应用创建多阶段构建
目录
先决条件
- 你有一个 Git 客户端。本节中的示例使用了基于命令行的 Git 客户端,但你可以使用任何客户端。
概述
本节将引导你为 C++ 应用创建一个多阶段 Docker 构建。多阶段构建是 Docker 的一个功能,它允许你在构建过程的不同阶段使用不同的基础镜像,这样可以优化最终镜像的大小,并将构建依赖项与运行时依赖项分开。
对于 C++ 等编译型语言,标准做法是设置一个用于编译代码的构建阶段和一个用于运行已编译二进制文件的运行时阶段,因为运行时不需要构建依赖项。
获取示例应用
让我们使用一个简单的 C++ 应用,它会向终端打印 Hello, World!
。为此,请克隆示例仓库以配合本指南使用
$ git clone https://github.com/dockersamples/c-plus-plus-docker.git
本节的示例位于仓库的 hello
目录下。进入该目录并查看文件
$ cd c-plus-plus-docker/hello
$ ls
你应该会看到以下文件
Dockerfile hello.cpp
检查 Dockerfile
在 IDE 或文本编辑器中打开 Dockerfile
。Dockerfile
包含构建 Docker 镜像的指令。
# Stage 1: Build stage
FROM ubuntu:latest AS build
# Install build-essential for compiling C++ code
RUN apt-get update && apt-get install -y build-essential
# Set the working directory
WORKDIR /app
# Copy the source code into the container
COPY hello.cpp .
# Compile the C++ code statically to ensure it doesn't depend on runtime libraries
RUN g++ -o hello hello.cpp -static
# Stage 2: Runtime stage
FROM scratch
# Copy the static binary from the build stage
COPY --from=build /app/hello /hello
# Command to run the binary
CMD ["/hello"]
Dockerfile
包含两个阶段
- 构建阶段:此阶段使用
ubuntu:latest
镜像来编译 C++ 代码并创建静态二进制文件。 - 运行时阶段:此阶段使用
scratch
镜像(一个空镜像),将静态二进制文件从构建阶段复制过来并运行它。
构建 Docker 镜像
要在 hello
目录中构建 Docker 镜像,请运行以下命令
$ docker build -t hello .
-t
标志将镜像标记为 hello
名称。
运行 Docker 容器
要运行 Docker 容器,请使用以下命令
$ docker run hello
你应该在终端看到输出 Hello, World!
。
总结
在本节中,你学习了如何为 C++ 应用创建多阶段构建。多阶段构建有助于优化最终镜像的大小,并将构建依赖项与运行时依赖项分开。在此示例中,最终镜像只包含静态二进制文件,不包含任何构建依赖项。
由于镜像使用空基础,通常的操作系统工具也不存在。因此,例如,你无法在容器中运行简单的 ls
命令
$ docker run hello ls
这使得镜像非常轻量且安全。