為你的 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
這使得映象非常輕巧和安全。