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

news/2025/9/25 14:26:14/文章来源:https://www.cnblogs.com/springcoming/p/19111145

步骤 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.mzph.cn/news/917073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux dmesg 内核日志查看工具详解

Linux dmesg 内核日志查看工具详解dmesg 是 CentOS 系统中一个非常重要的内核日志查看工具,它直接读取内核的环形缓冲区,为你提供了系统底层运作的“第一手资料”。下面这个表格汇总了它的核心应用场景和排查问题的基…

网站的基础建设项目大型定制网站最贵建设多少钱

VTK下载地址&#xff1a;https://vtk.org/download/ cmake下载地址&#xff1a;https://cmake.org/download/ 版本对应方面&#xff0c;如果你的项目对版本没有要求&#xff0c;就不用在意。我就是自己随机搭建的&#xff0c;VTK选择最新版本吧&#xff0c;如果后面其他的库不…

专业营销网站计算机网络技专业术网站开发

问题 使用qtdesigner设计好大体的软件结构&#xff0c;需要使用代码进行批量修改控件样式,self.ui.x 会被解释为访问 self.ui 中名为 x 的属性&#xff0c;而不是将 x 作为变量名来解析&#xff0c;此时需要通过字符串动态访问 self.ui 中的按钮对象 for i in range(20):x f…

【智慧】 gym104385

qwq题目注意到 \(b_i\leq n\),所以对于每个询问 \(a\) 只用暴力看对称轴在 \([a-\sqrt{n},a+\sqrt{n}]\) 范围内的抛物线。

__repr__魔术方法

__repr__ 是 Python 中一个非常重要的魔术方法(Magic Method),也常被称为双下划线方法 (Dunder Method)。它的主要作用是为对象提供一个官方的、明确的、面向开发者的字符串表示形式(Representation)。 简单来说,…

基于萤火虫算法(FA)优化支持向量机(SVM)参数的分类实现

一、算法原理 1. 萤火虫算法(FA)核心机制亮度计算:萤火虫亮度与目标函数值(SVM分类准确率)成正比(I0为初始亮度,γ为光吸收系数,ri为当前解与最优解的距离)位置更新:(β为吸引度,rij为萤火虫i与j的距离,α…

OSS cp(下载文件)

alfolder/ --only-current-dir -r下载文件夹(指定时间戳) 当某一个文件夹(包含子目录)下的文件修改时间在北京时间2023年10月31日10:09:18至2023年10月31日12:55:58内时,才会被下载。示例如下: ossutil cp -r os…

一个空间2个网站代码哪个平台可以免费卖货

部署官网参考文档 负载均衡参考 官网两种部署模式拓扑图和介绍 介绍两种高可用模式 堆叠 拓扑图如下&#xff08;图片来自k8s官网&#xff09;&#xff1a; 特点&#xff1a;将etcd数据库作为控制平台的一员&#xff0c;由于etcd的共识算法&#xff0c;所以集群最少为3个&…

有范同城旅游广告小程序系统:赋能旅游行业数字化运营新生态

在数字化浪潮席卷旅游行业的当下,高效的信息整合、精准的客户触达与灵活的商业合作模式,成为旅游从业者突破增长瓶颈的关键。有范同城旅游广告小程序系统(基于微擎系统开发)应运而生,整合微信与抖音双平台流量优势…

Active Directory安全指南:默认域管理员账户的安全管理

本文深入探讨Active Directory中默认域管理员账户的安全管理要点,包括账户使用时间、密码策略、Kerberos服务主体名称检查等关键技术细节,并提供实用的PowerShell命令用于安全审计。Active Directory安全指南 #5:默…

完整教程:第八篇:GIL全局解释器锁:原理、影响与应对策略

完整教程:第八篇:GIL全局解释器锁:原理、影响与应对策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

合合信息获首批“个人信息保护合规审计自审计能力评价”最高等级认证

View Post合合信息获首批“个人信息保护合规审计自审计能力评价”最高等级认证在国家施行《个人信息保护合规审计管理办法》背景下,合合信息凭借完善的数据安全管理体系,荣获首批"个人信息保护合规审计自审计能…

微云二手车运营版系统:多端覆盖的二手车平台解决方案

在数字化浪潮席卷二手车行业的当下,传统交易模式面临信息不透明、获客渠道单一、管理效率低下等痛点。微云二手车运营版系统应运而生,作为一款经过官方认证、功能全面的高端解决方案,它整合了多端平台资源,为二手车…

Linux常见命令1

文件管理命令含义备注cat 查看文件内容cat file.txtchgrp 变更文件或目录的所属群组 -f 不显示错误信息、-R 递归处理chmod 更改文件权限 ugoa 分别表示拥有者、同组、其他人、所有人; rwx 分布表示可读、写、执行cho…

下载并安装ossutil

下载并安装ossutilLinux Windows macOS 安装ossutil。 sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash说明安装过程中,需要使用解压工具(unzip、7z)解压软件包,请提前安装其中的一…

Unigine整合Myra UI Library全纪录(1)

什么是Myra? 这个是Myra:https://github.com/rds1983/Myra 熟悉WPF/Avalonia/Silverlight/UWP开发的朋友肯定一眼就能看出来这个UI库用的是什么佐料了。它当然不是完整的WPF实现,对于游戏开发而言也没必要用完整的W…

深圳龙岗网站建设培训学校宜昌网站seo收费

Solidity是什么 Solidity是一门面向合约的、为实现智能合约而创建的高级编程语言&#xff0c;主要目的是为了在以太坊虚拟机&#xff08;EVM&#xff09;上运行Solidity是静态语言&#xff0c;支持继承、库和复杂的用户定义等特性内含的类型除了常见的编程语言中的标准类型&am…

new 为数组开辟内容空间的时候,数组大小这个额外的信息是如何存储的? int * p = new int[5]; 指针p 指向的的int 数据地址还是数组大小的地址?

new 为数组开辟内容空间的时候,数组大小这个额外的信息是如何存储的? int * p = new int[5]; 指针p 指向的的int 数据地址还是数组大小的地址?在C++中,使用new int[5]动态分配数组时,数组大小的存储方式和指针指向…

Java适配器模式介绍与实现示例 - 指南

Java适配器模式介绍与实现示例 - 指南2025-09-25 14:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

网站建设法规政策高密建网站

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1084#question 成绩 T1:T1:T1:数数 题目大意 给出nnn&#xff0c;求∑i1n∑j1n(i∗j)\sum_{i1}^n \sum_{j1}^n (i*j)i1∑n​j1∑n​(i∗j) 和 ∏i1n∏j1n(i∗j)\prod_{i1}^n\prod_{j1}^n(i*j)i1∏n​j1∏n​(i∗j) 解题…