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)。