为你的 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这使得镜像非常轻巧和安全。