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

Docker教程:如何将Helix QAC创建为一个容器并运行?

在这里插入图片描述

在这个Docker教程中,你将了解到如何将Helix QAC创建为一个容器化的镜像并运行。

Docker的基本定义是一个开源且流行的操作系统级虚拟化(通常称为“容器化”)技术,它是轻量级且可移植的,主要在Linux和Windows上运行。Docker通过使用容器,使创建、部署和运行应用程序变得更加容易。

从根本上说,容器只是一个运行的进程,并应用了一些附加的封装特性。借助容器,开发人员(和DevOps管理员)可以将应用程序与运行应用程序所需的一切(包括代码、运行时刻、库、配置的环境变量和配置文件)打包在一起,并将所有内容作为一个软件包交付。

还值得一提的是,Docker可以立即启动,并具有内置的版本控制和组件复用机制。这些Docker容器可以通过公共Docker Hub或私有存储库共享,使它们易于访问和使用。

以下是Docker的一些显著优势:

  • 快速部署:Docker可以为每个进程创建一个容器,这些容器可以按需快速启动和关闭,而无需启动平台操作系统(OS)。这将部署过程时间缩短到几秒钟。此外,Docker镜像的启动几乎是即时的。
  • 可移植性:Docker可以将经过测试的容器化应用程序部署到任何其他运行Docker的系统上,并确保它的性能与测试时完全相同。Docker镜像可以与其他团队共享。
  • 性能:尽管虚拟机(VM)是容器的替代方案,但VM具有操作系统,而Docker容器没有。这意味着容器比VM占用更少的资源,创建速度更快,并且启动和关闭的时间也更快。
  • 持续集成效率:Docker使您能够构建容器镜像,并在开发、测试和部署的每个步骤中使用它。此外,您还可以将非依赖性步骤分开,然后并行运行它们,从而缩短从构建阶段到生产部署阶段所需的时间。这缩短了设置环境和调试环境特定问题的时间,使它们更可靠且更易于维护。

但是,Docker也有一些限制,即使它们对Docker的静态分析器的设置影响很小,但了解这些限制依然很重要。

  • Docker不能替代虚拟机:在虚拟机中运行的许多应用都可以移动到容器中,但并不是说所有的应用都需要或都可以移动到容器中。例如,具有严格监管要求的行业可能无法用容器替换虚拟机,因为虚拟机提供比容器更高级别的隔离。
  • 容器中的数据:有时容器会出现故障,在这种情况下,它需要备份和恢复策略。虽然有几种解决方案,但没有一种是自动化或可以扩展的。另一个限制是,除非在容器关闭之前将其保存在某个地方,否则当容器关闭时,其中的所有数据都将永远消失。
  • 跨平台兼容性:如果一个应用程序设计为在特定平台(例如Windows操作系统平台或Linux)上的Docker容器中运行,则无法在任何其他平台上运行。然而,虚拟机不受此限制,因此这种限制使Docker对于一些由Windows和Linux服务器组成的高度异构的环境不太具有吸引力。
  • 使用图形界面运行应用程序:总的来说,Docker是为托管在命令行上运行的应用程序而设计的。虽然有几种方法(比如使用X11转发或MobaXterm)可以让我们在Docker容器中运行图形界面,但这些过程很繁琐。因此,可以说Docker对于需要丰富接口的应用程序来说不是一个好的解决方案。

为了帮助大家更好地将静态分析工具设置为Docker,并解除这些限制,我将设置过程分解为三个简单的部分。

您可以从访问https://docs.docker.com/get-started/overview开始,里面有很多关于如何设置Docker引擎并验证环境是否正确设置的详细信息。

第一部分:准备Docker引擎

从此网站https://docs.docker.com/engine/install下载并安装适合您操作系统平台的Docker引擎。

通过运行名为“hello-world”的样例Docker镜像来验证Docker引擎是否已正确安装。使用此命令示例:

  • $ sudo docker运行hello-world
  • 该命令将下载一个简单的“hello-world”测试Docker镜像并在容器中运行它。因此,当容器运行时,它会打印一条信息性消息并退出。

下一部分的目标是设置一个Docker容器,让它作为Helix静态代码分析工具来运行。有几种方法可以配置Docker镜像以支持不同的编码合规性模块,例如MISRA、AUTOSAR、CWE、CERT和静态代码扫描工具等。

但是,在本教程中,我将只演示如何使用一些重要的组件来构建特定的Docker镜像,我们将在Docker容器中使用这些组件作为Helix QAC工具(DaaQT)。

另外,我还将讨论在运行分析扫描工具时,如何处理项目数据配置的持久化,这样您就可以将Helix QAC项目规范和项目支持配置文件存储在Docker容器外,比如prqa 项目文件夹和pqraproject.xml.支持的文件。

对这些文件所做的任何更改将在Docker容器执行完成并关闭后持久存在。任何构建脚本的更改都会从一个构建到另一个构建输出到主机上映射的外部项目文件夹,并保持持久性。

第二部分:创建、构建和运行

首先,让我们来确定一些我选择用于构建Docker镜像的组件及其基本描述。

  • Helix-QAC-2022.2(C/C++静态分析解析器)
  • ASCM-3.3.0(AUTOSAR C++14编码合规性)
  • M3CM-3.3.0(MISRA C 2012编码合规性)
  • MCPP-2.3.0(MISRA C++ 2008编码合规性)
  • CERTCCM-2.3.0(C语言的安全编码标准支持)
  • CERTCCPCM-2.3.0(CPP的安全编码标准支持)

接下来,下载您可用(或已购买)的Helix QAC解析器工具和编码合规性模块,并将这些安装文件放入主机上的已知文件夹位置。

  • 在我的示例中,将有六个文件(一个解析器工具文件和五个编码合规性模块)。

接下来,创建一个Docker构建脚本文件。例如,我将文件命名为“qacDockerfile”,没有文件扩展名(默认名称是“dockerfile”)。该文件将由Docker引擎用来创建您的Docker镜像。基本上,它有一个命令列表,将按从上到下的顺序发送给docker引擎来执行。

然后将这些文件(包括qacDockerfile)放在DaaQT文件夹中。这些是生成此 Docker镜像所需的唯一文件。另外,请注意我将它们放在“vDockerBuilds/DaaQT”文件夹下。
在这里插入图片描述

以下是“qacDockerfile”脚本文件的内容和一些解释。
在这里插入图片描述

  • 第1行选择了Ubuntu 22.04作为基础镜像。
  • 第4行到第7行使Ubuntu操作系统保持最新状态,并允许设置时区。
  • 第10行是可选的,但建议添加这些有用的工具,因为Ubuntu基础镜像是准系统。
  • 第15行将安装基本的构建工具、GNU编译器依赖项和任何支持文件。这一步针对编译器工具链的使用需求会有所不同。但是,在我的示例中,这个镜像将使用gcc/g++11编译器。
  • 第19行和第20行指示Docker引擎创建一个名为“QacWorkspace”的工作目录,所有后续命令都将使用该目录。
  • 第25行将所有安装文件的权限更改为可执行。
  • 第28行以静默模式安装Helix-QAC解析器工具并接受许可协议。
  • 第31行至第35行以静默模式安装选定的编码合规性模块并接受许可协议。
  • 第38行清理安装文件,使Docker镜像尽可能减少占用空间。

接下来,要构建Docker镜像,我们需要运行以下命令:
$> docker build --pull --no-cache -f qacDockerfile -t qacscatools:22v2.

  • 拉取和无缓存参数用于确保始终获取最新的ubuntu镜像,并从头开始构建Docker镜像。
  • -f是qacDockerfile名称,默认情况下原始名称是Dockerfile。
  • -t是格式“name:tag”因此名称是“qacscatools”,标签是“22v2”,以指示使用了哪个Helix-QAC工具版本。
  • 不要忘记末尾的“dot”,它表示这是一个本地目录。

构建镜像过程完成后,可以看到最后两行消息,指示写入文件并标记镜像。若要验证构建是否成功,请运行以下命令以显示所有可用Docker镜像列表。

  • $>docker images
    在这里插入图片描述

(注意:上图中,图像标签ID为bd8c9d08dc4d。)

第三部分:在本地项目上运行DaaQT

在我们使用这个Docker容器化镜像(作为QAC工具的Docker——DaaQT)在本地桌面项目上运行任何静态代码分析之前,我们需要确保我们有权访问许可证服务器,以获得使用该工具的权限。

在我的示例中,我将使用外部远程Reprise许可证管理服务器来请求要使用的许可证。

首先,我们需要创建一个本地项目运行脚本,该脚本知道在哪里以及如何访问远程 Reprise许可证服务器。此项目运行脚本还必须知道Helix QAC仪表板服务器的位置,以便在分析运行完成后上传项目诊断消息结果。

让我们审查一下名为“runQACSCA.sh”的脚本文件及其内容。我将逐步解释它的作用。
在这里插入图片描述

  • 第3行是对桌面计算机上项目文件夹名称的引用。
  • 第7行是Helix QAC仪表板服务器上项目持有者的名称,用于上传诊断消息和项目信息。(注意:第8行可用于匹配本地文件夹名称。)
  • 第9行到第11行是有关Helix QAC仪表板服务器的信息,例如URL地址(或FQDN)、服务器端口和许可证服务器端口。
  • 第14行是本地桌面项目工作区名称服务器URL地址(或 FQDN)、服务器端口和许可证服务器端口。
  • 第15行和第16行是对Helix QAC解析器工具所在位置的内部Docker镜像的引用,以及映射项目工作区的位置。
  • 第19行供Docker与许可证服务器通信,以请求使用工具许可证。
  • 第25行将Docker镜像设置为正确的入口点,以便定位映射的项目工作区。
  • 第28行到第29行是选择一个规则配置文件用于项目。这些默认文件名是针对特定规则组配置进行标识的。您可以通过合并任何一个或多个规则配置文件来创建自己的自定义RCF文件,但在使用之前,必须在Helix QAC桌面GUI应用程序中完成自定义RCF文件的创建。此外,新的自定义名称需要与默认文件名不同。
  • 第34行和第35行是为编译器工具链进行映射。在我的示例中,我已经映射到要使用地GNU C/CPP 11.2版本。
  • 第38行用于创建PRQA项目配置并设置需求项目配置。
  • 第41行让Helix QAC能够监控和跟踪项目如何用其命令进行本地构建。
  • 如果项目需要执行一些关系跨模块分析(RCMA)和/或多线程分析(MTA),则通常使用第44行和第45行。
  • 第47行到第49行是选择一个编码合规性模块,用于满足您的编码合规性要求需求。请确保此设置与第28行至第31行的RCF设置相匹配。
  • 第52行是使用上述所有配置和设置参数,对您的项目执行静态代码分析。
  • 第55行是将项目分析扫描结果上传到Helix QAC的仪表板服务器,并将其放在项目持有人中。上传的信息是包含诊断消息以及项目配置设置的源文件。

运行以下Docker命令,这些命令会将本地项目卷映射到Docker项目卷,以便保留分析数据文件。请密切注意ENTRYPOINT参数,其中的脚本文件“runQACSCA.sh”将从项目根文件夹执行。

以下是带有一些解释的Docker命令:
docker run --rm -it -v ~/ProjectsSandbox/MyCppCodeQac:/QacWorkspace/MyCppCodeQac–entrypoint=/QacWorkspace/MyCppCodeQac/runQACSCA.sh qacscatools:22v2

  • “run”,就是执行。
  • “-it”以交互方式运行Docker(因此您会获得一个带有STDIN的伪TTY)。
  • “–rm”会导致Docker在容器退出时自动删除容器。
  • “-v”表示卷映射LocalHostVolume:DockerVolume。
  • “–entrypoint” 为登录后的开始位置,可以是命令行开始运行带有指示内容的location/file_name.sh。

您也可以使用shell脚本来运行它,而不必记住在命令行上输入的所有参数。除了不必记住所有这些细节之外,这也使我们对脚本文件进行最小的更改,以适应其他类似的项目。

在我的例子中,我创建了一个名为“runDaaQT.sh”的shell脚本。
在这里插入图片描述

显示Docker命令行用法的屏幕截图。
在这里插入图片描述

显示shell脚本使用情况的屏幕截图。
在这里插入图片描述

作为选择,您也可以为CMakeNinja项目运行这个Docker容器,它的命令行与之前演示的项目类似。这个项目使用CMake和Ninja命令行构建系统。

要使用类似的命令行或shell脚本文件,您需要在命令行中对正确项目卷(CMakeNinja)名称的命令语法进行一些编辑,如下所示:

$> docker run --rm -it -v ~/QacProjectsSandbox/CMakeNinja:/QacWorkspace/CMakeNinja–entrypoint=/QacWorkspace/CMakeNinja/runQACSCA.sh qacscatools:22v2
在这里插入图片描述
显示CMakeNinja项目命令行用法的屏幕截图。
作者简介:
在这里插入图片描述
Dzuy Tran
Klocwork和Helix QAC高级解决方案架构师,Perforce公司

DzuyTran在硬件和软件嵌入式系统,RTOS,移动应用程序和企业系统的设计和开发方面拥有30多年的经验。当客户遇到技术问题时,他会帮助他们,协助进行概念验证,并演示静态代码分析工具,并帮助指导客户进行 DevOps 实施流程和持续集成部署。Dzuy拥有国立理工大学计算机科学和计算机工程硕士学位。

文章来源:http://bit.ly/3ZTux4I

相关文章:

Docker教程:如何将Helix QAC创建为一个容器并运行?

在这个Docker教程中,你将了解到如何将Helix QAC创建为一个容器化的镜像并运行。 Docker的基本定义是一个开源且流行的操作系统级虚拟化(通常称为“容器化”)技术,它是轻量级且可移植的,主要在Linux和Windows上运行。D…...

1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光,看起来MIT的课程的确是很有饱满度。 这里,再整理一份课程中的作业要求。 …...

记一次内存泄漏问题的排查

阶段一: 前段时间,突然发现服务在毫无征兆的情况下发生了重启。去看了一下容器退出的日志,发现内存利用率超过了100%,导致容器重启,进一步看了skyWalking,发现heap内存超了,当时只是简单的以为是…...

QML控件--Drawer

文章目录一、控件基本信息二、控件使用三、属性成员一、控件基本信息 Import Statement:import QtQuick.Controls 2.14 Since:Qt 5.7 Inherits:Popup 二、控件使用 Drawer:提供一个可以使用滑动手势打开和关闭的侧面板&#xff…...

PHY- PHY芯片概述

1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…...

【C++】如何获取当前正在运行的函数的名称?

func、FUNCTION、__PRETTY_FUNCTION__的区别 常用获取函数名成的方法都有__func__、FUNCTION、PRETTY_FUNCTION。那么它们的区别是什么呢?   1) func、FUNCTION: 主要是获取函数的名称。   2) PRETTY_FUNCTION: 不仅能获取函数的名称&am…...

42.原型对象 prototype

目录 1 面向对象与面向过程 2 原型对象 prototype 3 在内置对象中添加方法 4 constructor 属性 5 实例对象原型 __proto__ 6 原型继承 7 原型链与instanceof 7.1 原型链 7.2 instanceof 8 案例-模态框 1 面向对象与面向过程 编程思想有 面向过程 与 面向…...

python 读写txt方法

​​​​​​​ 1. Python支持在程序中读写 txt文件。这里有两种方式: 方式一:使用 python内置函数,该函数将一个字符串的长度转换为与这个字符串长度相关的值。 例如:" readme"("r)。 prin…...

香橙派pi5下,debian,docker19.03.9版本runc容器逃逸

在香橙派pi5下,debian,docker19.03.9版本下,安装系统后,启动docker,显示一切正常。 当加入k8s集群以后,可以正常连接到集群,node状态显示为ready。看起来一切正常。不过过一会之后,香橙派节点内存飙升,然后挂掉。重连失败,需要重启后才能重连。且swapoff -a命令执行…...

Thinkphp6.0中间件.上

本节课我们来学习一下中间件的用法,定义一下中间件。 一.定义中间件 1. 中间件的主要用于拦截和过滤 HTTP 请求,并进行相应处理; 2. 这些请求的功能可以是 URL 重定向、权限验证等等; 3. 为了进一步了解中间件的用法&…...

十进制到八进制的转换

目录 十进制到八进制的转换 程序设计 程序分析 十进制到八进制的转换 【问题描述】对于输入的任意一个非负十进制整数n(0=<n<100000),打印输出与其等值的八进制数 【输入形式】非负十进制整数 【输出形式】相应十进制整数转换后的八进制正整数,若输入不符合要求,…...

【从零开始学Skynet】基础篇(四):网络模块常用API

游戏服务端要处理客户端请求&#xff0c;作为服务端引擎&#xff0c;网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API&#xff0c;常用的API如下表所示&#xff1a;Lua API说明socket.listen(address ,port)监听一个端口&#xff0c;返回…...

怎么免费制作logo?logo免费设计在线生成,从此设计不求人

你有没有因为Logo制作而烦恼过&#xff1f;对于很多人来说&#xff0c;logo制作是一项比较大的工程&#xff0c;需要专门的设计师才能完成。但是请人设计费用高还很费时间&#xff0c;还需多次沟通修改。其实&#xff0c;我们可以自己免费制作logo&#xff0c;下面&#xff0c;…...

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息&#xff0c;那么是否有办法加入一些先验信息来提升目标检测的精准度&#xff1f; 一种可行的思路是在目标检测的输出加入目标之间的关联信息&#xff0c;从而对目标进行干涉。 2017年8月&#xff0c;新加波管理大学…...

IDEA重复下载SNAPSHOT包问题

问题现象 reimport 之后 状态栏显示resolving dependencies… 遇到某个比较大的快照包(33M)&#xff0c;同一天的第2个版本时 1.0-xxx-SNAPSHOT.时间戳-2 idea importer 会先分片下载 x.jar.part文件中&#xff0c;然后复制为x.jar吧 如图中所示&#xff0c;其实已经下载完了&…...

【Unity入门】12.MonoBehaviour事件函数

【Unity入门】MonoBehaviour事件函数 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;常用的事件函数 &#xff08;1&#xff09;start和update方法 之前我们写的脚本&#xff0c;会默认帮助…...

1.3 Docker Compose-详细介绍

Docker Compose是一个用于定义和运行多个Docker容器的工具。它可以让用户轻松地定义和管理多个容器的配置&#xff0c;并且可以通过简单的命令来启动、停止和重启这些容器。在本文中&#xff0c;我们将详细介绍Docker Compose的使用和功能。 一、Docker Compose的安装 Docker…...

数据分析:麦当劳食品营养数据探索并可视化

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;关注…...

ES6标准

ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准 前端es6是模块化开发&#xff1b;es6模块化规范就是浏览器端与服务器端通用的模块化开发规范&#xff0c;其中定义了每一个JavaScript文件都是一个独立的模块&#xff0c;导入其他模块成员…...

ASP一个物流商品运输系统的设计与实现

物流运输行业的今天正朝着追求高效、低成本、稳定可靠的方向发展。本文详细介绍了网上物流管理系统&#xff0c;涉及到客户端运输线路设计、过程跟踪等功能模块以及管理员端的相应模块的具体实现&#xff0c;分析了整个系统的架构、工作原理、实现功能等。系统采用ASPMS SQL以B…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...