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

创提信息
2022/03/21

分享到

在这个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。使用以下命令示例:
         o $ sudo dockerrunhello-world
         o 该命令将下载一个简单的hello-world测试Docker镜像,并在容器内运行它。因此,当容器运行时,会打印一条信息消息并退出。

 
在Docker容器使用指南的下一部分中,我们的目标是设置Klocwork。有几种方法可以配置Docker镜像以支持不同的Klocwork组件。您可以为每个镜像中的单个或组合组件构建Docker镜像(这些是受支持的组件,如Klocwork Portal),构建运行集成分析的机器、持续(差异)分析工具或桌面命令行工具。
 
我将只演示如何构建一个特定的Docker镜像,这将是一个运行集成静态代码分析(Integration Static Code Analysis)的静态代码分析构建工具机器。此外,我将讨论在运行Klocwork分析时如何保存数据,您可以在Docker容器外存储Klocwork构建规范和分析数据(例如,buildspec, tracefiles, tables, .kwlp/.kwps和projects_root)。
 
因此,如果您正在使用kwbuildproject命令中的--incremental参数,那么每一次构建时都必须保存--tables-directory。因此,在我的设置中,我将把这些文件输出到主机上的外部项目文件夹中。


第二部分:创建、构建和运行
 
    1. 下载Klocwork安装文件工具包,并将其内容解压缩到您主机上的一个已知文件夹位置。确保将Klocwork服务器(Klocwork Web Portal)安装在同一台机器上或您可以轻松访问的另一台服务器上。在解压缩安装工具包时,您将需要两个文件:       

         o kwbuiltools.version.zip
         o kwciagent.version.zip
 
    2. 创建一个文件——例如,没有文件扩展名的“kwDockerfile”(默认名称为Dockerfile)。这个文件将被Docker引擎用来创建您的Docker镜像。基本上,它有一个命令列表将会发送到Docker引擎,使其按照从上到下的顺序执行命令。
         o 以下是生成这个Docker镜像仅需的三个文件。我把它们放在我主机上的本地文件夹中(文件夹名称是“vDockerBuilds”),这个文件夹也是我放置创建的文件(“kwDockerfile”)的地方。

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

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

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

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

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

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

    1. 获取ltoken文件,并按照命令序列在已知位置生成ltoken。
         o 选择一台能够访问Klocwork服务器和许可的机器,然后运行以下命令:
              $> export KLOCWORK_LTOKEN=~/To_A_Known_Location/ltoken
              $>kwauth --urlhttp://klocwork_server:8080
 
为了清楚起见,下面是我用来生成ltoken文件并将其放到已知位置的实际命令:

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

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


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

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

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

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

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

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

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

    3. 运行以下Docker命令,将本地项目卷映射到Docker项目卷,这样分析数据文件将被存储。请密切注意ENTRYPOINT参数,其中脚本文件“runKWSCA.sh”将从项目根文件夹中被执行。以下是Docker命令:
        o $> 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
 
输出结果截屏如下:

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

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

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