Docker容器使用指南:如何将Klocwork作为一个容器创建和运行

2024-04-22 05:48

本文主要是介绍Docker容器使用指南:如何将Klocwork作为一个容器创建和运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这个Docker容器使用指南中,您将学习如何创建和运行Klocwork容器。

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

从根本上说,容器只不过是一个应用了一些附加封装特性的运行流程。因此,有了容器,开发人员(和DevOps管理员)就可以将应用程序与运行该应用程序所需的所有东西(包括代码、运行时、库、已配置的环境变量和配置文件)打包,并将其作为一个包发布。

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

Docker既有优点,也有缺点。虽然未全面列举,但以下是一些最显著的优势:

  • 快速部署:Docker可以将部署流程的时间缩短到秒级。这是因为它可以为每个流程创建一个容器,然后根据需要将其快速加载和卸载,而不需要启动平台操作系统(OS)。此外,Docker镜像的切换几乎是瞬时的。
  • 可移植性:Docker支持应用程序的可移植性。这意味着,一旦您测试了您的容器化应用程序,您就可以将其部署到Docker正在运行的任何其他系统上,并确保它的执行情况与您测试时完全一样。因此,Docker镜像可以与其他团队共享。这节省了时间,因为他们需要的一切都是可获得的、配置好的、随时可用的。
  • 性能:虽然虚拟机可以替代容器,但虚拟机(VM)有操作系统(OS),而Docker容器没有,这意味着容器比虚拟机(VM)占用的空间更小,创建的速度更快,加载和卸载的时间也更短。
  • 持续集成效率:Docker使您能够构建容器镜像,并在从开发、测试到部署整个流程的每个步骤中使用它。此外,您还可以将不相关的步骤分隔开,然后并行运行它们,这将缩短从构建阶段到生产部署阶段所花费的时间。这也减少了设置环境和调试特定于环境的问题所需的时间——这使它们更可靠,更容易维护。

然而,Docker也有一些限制,尽管对Docker静态代码分析器的设置影响很小,甚至为零,但它们还是值得一提。

  • Docker无法替代虚拟机:许多在虚拟机(VM)上运行的应用程序可以移动到一个容器中,但这并不意味着所有的应用程序都可以或应该被移动到一个容器中。例如:具有严格监管要求的行业可能无法将虚拟机(VM)更换为容器,因为虚拟机(VM)比容器提供更多的隔离。
  • 容器中的数据:有时容器会发生故障,在这种情况下,需要一个备份和恢复策略。虽然有几种解决方案,但没有一种是自动化的或可扩展的。另一个限制是,除非在容器发生故障之前先将其保存在某个地方,否则容器关闭时,里面的所有数据将永远消失。
  • 跨平台兼容性:有一个主要的问题:如果一个应用程序被设计成在Windows OS平台上的Docker容器内运行,这意味着它无法在Linux或任何其他平台上运行。然而,虚拟机不受这个限制,所以这个限制使得Docker对一些由Windows和Linux服务器共同组成的高度异构的环境缺乏吸引力。
  • 使用图形界面运行应用程序:通常,Docker专门设计用于托管在命令行上运行的应用程序。虽然我们有一些方法(比如使用X11转发或新建会话)可以让我们在Docker容器内运行图形界面,但这些流程很笨拙。这就是为什么我们会说Docker对于需要丰富界面的应用程序不是一个好的解决方案。

为了帮助您将静态代码分析器设置为Docker并绕过这些限制,我将把设置分解为三个简单的部分。

从https://docs.docker.com/get-started/overview这个网址开始将是一个很好的选择,该网址上有很多关于设置Docker引擎的详情,以及如何验证环境是否正确设置Docker引擎。

第一部分:准备Docker引擎

  1. 安装Docker CE(社区版本)之前,删除任何旧版本的Docker(有时称为docker, docker.io,或docker-engine)。
  2. 从https://docs.docker.com/engine/install/ubuntu这个网址下载并安装Docker引擎。
  3. 通过运行示例D来验证Docker 引擎是否已正确安装。
  4. Docker镜像又称为“hello-world”。使用以下命令示例:
    • $ sudo dockerrunhello-world
    • 该命令将下载一个简单的“hello-world”测试Docker镜像,并在容器内运行它。因此,当容器运行时,会打印一条信息消息并退出。

在Docker容器使用指南的下一部分中,我们的目标是设置Klocwork。有几种方法可以配置Docker镜像以支持不同的Klocwork组件。您可以为每个镜像中的单个或组合组件构建Docker镜像(这些是受支持的组件,如Klocwork Portal),构建运行集成分析的机器、持续(差异)分析工具或桌面命令行工具。

我将只演示如何构建一个特定的Docker镜像,这将是一个运行集成静态代码分析(Integration Static Code Analysis)的静态代码分析构建工具机器。此外,我将讨论在运行Klocwork分析时如何保存数据,您可以在Docker容器外存储Klocwork构建规范和分析数据(例如buildspec, tracefiles, tables, .kwlp/.kwpsprojects_root)。

因此,如果您正在使用kwbuildproject命令中的‘--incremental’参数,那么每一次构建时都必须保存‘--tables-directory’。因此,在我的设置中,我将把这些文件输出到主机上的外部项目文件夹中。

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

  1. 下载Klocwork安装文件工具包,并将其内容解压缩到您主机上的一个已知文件夹位置。确保将Klocwork服务器(Klocwork Web Portal)安装在同一台机器上或您可以轻松访问的另一台服务器上。在解压缩安装工具包时,您将需要两个文件:
    • kwbuiltools.<version>.zip
    • kwciagent.<version>.zip
  2. 创建一个文件——例如,没有文件扩展名的“kwDockerfile”(默认名称为Dockerfile)。这个文件将被Docker引擎用来创建您的Docker镜像。基本上,它有一个命令列表将会发送到Docker引擎,使其按照从上到下的顺序执行命令。
    • 以下是生成这个Docker镜像仅需的三个文件。我把它们放在我主机上的本地文件夹中(文件夹名称是“vDockerBuilds”),这个文件夹也是我放置创建的文件(“kwDockerfile”)的地方。

  •   以下是“kwDockerfile”文件的内容以及一些具体的解释:

  • 第1行首先使用Ubuntu 20.04作为基础镜像。
  • 第8行是可选但建议添加的有用工具,因为基础镜像只是裸机。
  • 第12至14行将安装Klocwork应用程序所需的库依赖项。
  • 第19行将安装gnu编译器依赖项,这一步会根据使用的编译器而有所不同。但是,就我而言,这个镜像将使用gcc/g++8编译器。
  • 第24行指导Docker引擎创建一个工作目录调用‘klocwork’,所有的子序列命令都将使用该目录。
  • 第27至31行基本上是将构建工具解压缩到Klocwork工作目录中,然后通过删除压缩文件进行清理。

3. 运行以下命令来构建Docker镜像:

  • $> docker build -f kwDockerfile -t kwscatools:20v3 . 
    • -fkwDockerfile名称,默认名称为dockerfile
    • -t是格式‘name:tag’namekwscatoolstag20v3
    • 不要忘记末尾的dot,这说明它是一个本地目录。
  • 一旦构建镜像的流程完成,您就可以看到最后两行消息,这两行消息指示写入文件并标记镜像。要验证构建是否成功,需运行以下命令以显示所有可用Docker镜像的列表。在下面的镜像中,镜像Tag ID是11ec8d62c0d6
    • $>docker images

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

您将需要与经过身份验证的Klocwork工具用户账号相关联的ltoken文件。然后设置脚本以运行SCA docker,使项目数据文件在docker外部存储。这确保了当docker镜像停止时,所有数据不会消失。

  1. 获取ltoken文件,并按照命令序列在已知位置生成ltoken。
    • 选择一台能够访问Klocwork服务器和许可的机器,然后运行以下命令:
      • $> export KLOCWORK_LTOKEN=~/<To_A_Known_Location>/ltoken
      • $>kwauth --urlhttp://<klocwork_server>:8080

为了清楚起见,下面是我用来生成ltoken文件并将其放到已知位置的实际命令:

下面是ltoken文件内容的文本视图。每个值用分号隔开:

  • Klocwork服务器的IP地址(或FQDN名称)、服务器端口号、有效的用户账号和一个很长的哈希码

将ltoken文件放在您的本地项目根文件夹中。如您所见,每一个根文件夹都有各自的ltoken文件:

2.通过创建一个shell脚本文件,将这些数据文件(buildspec, kwtable, etc.)输出到主机上的项目文件夹中,该脚本文件将在Docker镜像中运行三个典型的SCA操作(kwinject,kwbuildproject和kwadmin)。该脚本文件还将使用Docker命令把本地项目卷挂载到Docker项目卷,以便Docker镜像运行流程完成后,分析数据文件将被存储。这是“runKWSCA.sh”文件的内容(见上面的截图)。

              示例:“MyCppCode”项目脚本文件:

  • 第4行是项目文件夹名称。
  • 第6至8行是对另一台机器上的Klocwork服务器的引用。
  • 第11至14行是Docker镜像内部映射的工作目录。
  • 第19、20行是映射到项目卷的“ltoken”文件位置(重要)。
  • 第26行是为了确保您位于项目根目录映射卷中。
  • 第31至33行是项目清理。
  • 第37、41、46行是Klocwork工具的操作步骤。

3. 运行以下Docker命令,将本地项目卷映射到Docker项目卷,这样分析数据文件将被存储。请密切注意ENTRYPOINT参数,其中脚本文件“runKWSCA.sh”将从项目根文件夹中被执行。以下是Docker命令: 

    $> docker run --rm -it -v ~/ProjectsSandbox/MyCppCode:/klocwork/MyCppCode --entrypoint=/klocwork/MyCppCode/runKWSCA.sh kwscatools:20v3

  • run,是执行
  • -it交互式地运行Docker (所以您会获得一个带有STDIN的伪TTY)
  • --rm使Docker在其退出时自动移除容器
  • -v指映射LocalHostVolume:DockerVolume的卷
  • --entrypoint用于登录时从何处开始,命令行可以使用指令内容开始运行location/file_name.sh

输出结果截屏如下:

4. 或者,您也可以为CMakeNinja项目运行这个Docker容器,它有一个类似于之前项目的命令。但是,您需要确保在命令行中附加正确的项目卷(CMakeNinja)。

“原创内容,转载请标明出处”

这篇关于Docker容器使用指南:如何将Klocwork作为一个容器创建和运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924956

相关文章

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa