当前位置: 首页 > news >正文

Docker打包CMake项目镜像操作步骤

步骤 1:创建项目目录结构

HelloWorldProject/
├── CMakeLists.txt
├── Dockerfile
└── HelloWorld.cpp

步骤 2:编写 HelloWorld.cpp

HelloWorld.cpp 中写:

#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

步骤 3:编写 CMakeLists.txt

在项目根目录下创建 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(HelloWorld)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)# 添加可执行文件
add_executable(helloworld HelloWorld.cpp)

步骤 4:在本地测试 CMake 编译

  1. 创建构建目录并进入:
mkdir build
cd build
  1. 生成 Makefile:
cmake ..
  1. 编译:
cmake --build .
  1. 运行:
./helloworld

你应该看到输出:

Hello, World!

步骤 5:编写 Dockerfile

在项目根目录下创建 Dockerfile

# ===== 编译阶段 =====
FROM ubuntu:22.04 AS builder# 安装构建工具
RUN apt-get update && \apt-get install -y build-essential cmake && \rm -rf /var/lib/apt/lists/*# 设置工作目录
WORKDIR /app# 复制项目文件
COPY . .# 创建构建目录并编译
RUN mkdir build && cd build && cmake .. && cmake --build .# ===== 运行阶段 =====
FROM ubuntu:22.04# 设置工作目录
WORKDIR /app# 仅从 builder 阶段复制可执行文件
COPY --from=builder /app/build/helloworld .# 设置容器启动命令
CMD ["./helloworld"]

步骤 6:构建 Docker 镜像

在项目根目录下执行:

docker build -t helloworld-cpp .

这里 helloworld-cpp 是镜像名称。


步骤 7:运行 Docker 容器

docker run --rm helloworld-cpp

输出应该是:

Hello, World!

💡 注意事项:

  1. 如果项目有多文件或第三方依赖,可在 CMakeLists.txt 和 Dockerfile 中适当调整。

  2. 可以通过多阶段构建优化镜像大小,将编译阶段和运行阶段分开:

    • 编译阶段用 ubuntudebian 带编译工具。
    • 运行阶段只用 scratchubuntu:22.04 仅复制可执行文件。
http://www.hskmm.com/?act=detail&tid=16926

相关文章:

  • Linux dmesg 内核日志查看工具详解
  • 【智慧】 gym104385
  • __repr__魔术方法
  • 基于萤火虫算法(FA)优化支持向量机(SVM)参数的分类实现
  • OSS cp(下载文件)
  • 有范同城旅游广告小程序系统:赋能旅游行业数字化运营新生态
  • Active Directory安全指南:默认域管理员账户的安全管理
  • 微云二手车运营版系统:多端覆盖的二手车平台解决方案
  • Linux常见命令1
  • 下载并安装ossutil
  • Unigine整合Myra UI Library全纪录(1)
  • new 为数组开辟内容空间的时候,数组大小这个额外的信息是如何存储的? int * p = new int[5]; 指针p 指向的的int 数据地址还是数组大小的地址?
  • 欧拉函数学习笔记
  • PDF论文文字公式提取,翻译与对照代码(自用)
  • Lambda表达式 - AlgosEng
  • ABAP 调用HTTP上传附件中文乱码
  • PDF入参以及模板对应签章图踩坑点 JAR版本为 iText5
  • 从 0 到 1 精通 SkyWalking:分布式系统的 “透视镜“ 技巧全解析
  • 系统调用brk 和 mmap 有什么不同?
  • 雷达系统杂波设计与仿真
  • 国标GB28181视频平台EasyCVR一体化加油站安防视频监控方案与实践
  • JavaScript 沙箱
  • PDF入参以及模板对应签章图踩坑点
  • 高性能PCIe 3.0软核,x1~x16,支持EP/RC,AXI4接口,内置DMA控制器,适用ASIC和FPGA
  • 使用git clone 批量下载huggingface模型文件
  • Python 换进安装GDAL
  • sync(同步本地文件到OSS)
  • MyBatisPlus 会默认设置 mybatis 的 scanPackages 为当前 BeanFactory 的 auto-configuration 的 base packages
  • 工程实践 使用本地包开发python项目
  • 详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战