多阶段构建怎么实现 C++ 编译环境与运行环境的分离

夏静大大_2605

夏静大大_2605

2026-08-31

260人浏览

原创

c++多阶段docker构建核心是分离编译与运行环境:第一阶段用gcc:13等完整镜像编译并安装产物,第二阶段用alpine:latest等轻量镜像仅复制二进制文件,通过copy --from=builder传递,彻底剔除构建工具与源码,实现体积最小化与安全性提升。

多阶段构建怎么实现 c++ 编译环境与运行环境的分离

多阶段构建实现 C++ 编译环境与运行环境分离,核心是用一个阶段完成编译(含依赖下载、头文件处理、链接等),另一个阶段仅保留最小化运行时所需内容(如静态可执行文件、必要系统库),两者通过中间产物(通常是二进制文件)传递,互不共享文件系统或环境变量。

编译阶段:专注构建,不关心运行

该阶段使用完整开发镜像(如 ubuntu:22.04 或 gcc:13),安装编译器、CMake、测试工具、调试符号等。关键点:

  • 所有源码、构建脚本、第三方依赖(如 fmt、spdlog)都在此阶段拉取和编译
  • 推荐启用 -DCMAKE_BUILD_TYPE=Release 和 -DBUILD_SHARED_LIBS=OFF,便于后续静态链接
  • 若项目支持,优先使用 make install 或 cmake --install 将产物安装到临时前缀(如 /tmp/staging),方便下一阶段精准复制
  • 避免在该阶段生成调试符号(或单独剥离)——除非需要调试版镜像

运行阶段:极简、安全、可复现

该阶段从基础轻量镜像启动(如 alpine:latest 或 scratch),只复制上一阶段产出的可执行文件及必要资源:

Dolphindb Docker
Dolphindb Docker

自动化 DolphinDB Docker 部署,支持自动架构检测(ARM64/x86_64),智能内存分配(50% 规则)以及完整数据持久化。

下载
  • 若已静态编译(g++ -static),直接复制二进制到 scratch 镜像即可,体积常小于 10MB
  • 若需动态链接(如依赖 libstdc++.so.6),可用 ldd 查出依赖库,再用 cp + mkdir -p 复制到 Alpine 镜像中对应路径(注意 Alpine 使用 musl,需选 glibc 兼容镜像如 tonistiigi/glibc)
  • 不复制任何构建工具、头文件、源码、.a 或 .so 开发包 —— 这些对运行毫无意义,反而增大攻击面
  • 设置非 root 用户、工作目录、健康检查端点(如适用),提升容器安全性与可观测性

连接两阶段:靠 Docker 的 COPY --from= 或构建缓存

以 Dockerfile 为例,典型写法如下:

# 构建阶段
FROM gcc:13 AS builder
WORKDIR /src
COPY CMakeLists.txt ./
COPY src/ ./src/
RUN cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF && \
    cmake --build build --target install --config Release
<h1>运行阶段</h1><p>FROM alpine:latest
RUN apk add --no-cache ca-certificates
COPY --from=builder /usr/local/bin/myapp /usr/local/bin/myapp
ENTRYPOINT ["/usr/local/bin/myapp"]
</p>

这里 --from=builder 是关键:它让运行阶段完全脱离构建环境,连 GCC 都不存在于最终镜像中。即使 builder 阶段被删,只要构建缓存存在,运行阶段仍可复现。

延伸:配合 CMake 分层与编译防火墙更进一步

若项目已采用分层 CMake 结构(如 common/、io/、app/),可在构建阶段为各模块分别指定 INSTALL 规则,确保只暴露接口头文件和稳定 ABI 的库;再结合编译防火墙规则(如禁用 strcpy、强制 -Werror),把合规检查嵌入构建阶段,使“可运行”同时意味着“已验证”。这样分离的不只是环境,更是职责边界。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

docker c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Docker 官方文档
Docker 官方文档

共0课时 | 0人学习

宝塔 Docker 模块使用手册
宝塔 Docker 模块使用手册

共0课时 | 0人学习