成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對構建系統(tǒng)進行容器化的指南

系統(tǒng) Linux
在使用容器搭建了一些構建系統(tǒng)后,我覺得有一個不錯的可復用的方法值得分享。雖然這些構建系統(tǒng)被用于編譯機器學習算法和為嵌入式硬件生成可加載的軟件鏡像,但這個方法足夠抽象,可用于任何基于容器的構建系統(tǒng)。

[[326817]]

搭建一個通過容器分發(fā)應用的可復用系統(tǒng)可能很復雜,但這兒有個好方法。

一個用于將源代碼轉換成可運行的應用的構建系統(tǒng)是由工具和流程共同組成。在轉換過程中還涉及到代碼的受眾從軟件開發(fā)者轉變?yōu)樽罱K用戶,無論最終用戶是運維的同事還是部署的同事。

在使用容器搭建了一些構建系統(tǒng)后,我覺得有一個不錯的可復用的方法值得分享。雖然這些構建系統(tǒng)被用于編譯機器學習算法和為嵌入式硬件生成可加載的軟件鏡像,但這個方法足夠抽象,可用于任何基于容器的構建系統(tǒng)。

這個方法是以一種易于使用和維護的方式搭建或組織構建系統(tǒng),但并不涉及處理特定編譯器或工具容器化的技巧。它適用于軟件開發(fā)人員構建軟件,并將可維護鏡像交給其他技術人員(無論是系統(tǒng)管理員、運維工程師或者其他一些頭銜)的常見情況。該構建系統(tǒng)被從終端用戶中抽象出來,這樣他們就可以專注于軟件。

為什么要容器化構建系統(tǒng)?

搭建基于容器的可復用構建系統(tǒng)可以為軟件團隊帶來諸多好處:

  • 專注:我希望專注于應用的開發(fā)。當我調用一個工具進行“構建”時,我希望這個工具集能生成一個隨時可用的二進制文件。我不想浪費時間在構建系統(tǒng)的查錯上。實際上,我寧愿不了解,或者說不關心構建系統(tǒng)。
  • 一致的構建行為:無論在哪種使用情況下,我都想確保整個團隊使用相同版本的工具集并在構建時得到相同的結果。否則,我就得不斷地處理“我這咋就是好的”的麻煩。在團隊項目中,使用相同版本的工具集并對給定的輸入源文件集產生一致的輸出是非常重要。
  • 易于部署和升級:即使向每個人都提供一套詳細說明來安裝一個項目的工具集,也可能會有人翻車。問題也可能是由于每個人對自己的 Linux 環(huán)境的個性化修改導致的。在團隊中使用不同的 Linux 發(fā)行版(或者其他操作系統(tǒng)),情況可能還會變得更復雜。當需要將工具集升級到下一版本時,問題很快就會變得更糟糕。使用容器和本指南將使得新版本升級非常簡單。

對我在項目中使用的構建系統(tǒng)進行容器化的這些經驗顯然很有價值,因為它可以緩解上述問題。我傾向于使用 Docker 作為容器工具,雖然在相對特殊的環(huán)境中安裝和網絡配置仍可能出現問題,尤其是當你在一個使用復雜代理的企業(yè)環(huán)境中工作時。但至少現在我需要解決的構建系統(tǒng)問題已經很少了。

漫步容器化的構建系統(tǒng)

我創(chuàng)建了一個教程存儲庫,隨后你可以克隆并檢查它,或者按照本文內容進行操作。我將逐個介紹存儲庫中的文件。這個構建系統(tǒng)非常簡單(它運行 gcc),從而可以讓你專注于這個構建系統(tǒng)結構上。

構建系統(tǒng)需求

我認為構建系統(tǒng)中有兩個關鍵點:

  • 標準化構建調用:我希望能夠指定一些形如 /path/to/workdir 的工作目錄來構建代碼。我希望以如下形式調用構建:

    1. ./build.sh /path/to/workdir

    為了使得示例的結構足夠簡單(以便說明),我將假定輸出也在 /path/to/workdir 路徑下的某處生成。(否則,將增加容器中顯示的卷的數量,雖然這并不困難,但解釋起來比較麻煩。)

  • 通過 shell 自定義構建調用:有時,工具集會以出乎意料的方式被調用。除了標準的工具集調用 build.sh 之外,如果需要還可以為 build.sh 添加一些選項。但我一直希望能夠有一個可以直接調用工具集命令的 shell。在這個簡單的示例中,有時我想嘗試不同的 gcc 優(yōu)化選項并查看效果。為此,我希望調用:

    1. ./shell.sh /path/to/workdir

    這將讓我得到一個容器內部的 Bash shell,并且可以調用工具集和訪問我的工作目錄(workdir),從而我可以根據需要嘗試使用這個工具集。

構建系統(tǒng)的架構

為了滿足上述基本需求,這是我的構架系統(tǒng)架構:

 

Container build system architecture

在底部的 workdir 代表軟件開發(fā)者用于構建的任意軟件源碼。通常,這個 workdir 是一個源代碼的存儲庫。在構建之前,最終用戶可以通過任何方式來操縱這個存儲庫。例如,如果他們使用 git 作為版本控制工具的話,可以使用 git checkout 切換到他們正在工作的功能分支上并添加或修改文件。這樣可以使得構建系統(tǒng)獨立于 workdir 之外。

頂部的三個模塊共同代表了容器化的構建系統(tǒng)。最左邊的黃色模塊代表最終用戶與構建系統(tǒng)交互的腳本(build.shshell.sh)。

在中間的紅色模塊是 Dockerfile 和相關的腳本 build_docker_image.sh。開發(fā)運營者(在這個例子中指我)通常將執(zhí)行這個腳本并生成容器鏡像(事實上我多次執(zhí)行它直到一切正常為止,但這是另一回事)。然后我將鏡像分發(fā)給最終用戶,例如通過容器信任注冊庫container trusted registry進行分發(fā)。最終用戶將需要這個鏡像。另外,他們將克隆構建系統(tǒng)的存儲庫(即一個與教程存儲庫等效的存儲庫)。

當最終用戶調用 build.sh 或者 shell.sh 時,容器內將執(zhí)行右邊的 run_build.sh 腳本。接下來我將詳細解釋這些腳本。這里的關鍵是最終用戶不需要為了使用而去了解任何關于紅色或者藍色模塊或者容器工作原理的知識。

構建系統(tǒng)細節(jié)

把教程存儲庫的文件結構映射到這個系統(tǒng)結構上。我曾將這個原型結構用于相對復雜構建系統(tǒng),因此它的簡單并不會造成任何限制。下面我列出存儲庫中相關文件的樹結構。文件夾 dockerize-tutorial 能用構建系統(tǒng)的其他任何名稱代替。在這個文件夾下,我用 workdir 的路徑作參數調用 build.shshell.sh

  1. dockerize-tutorial/
  2. ├── build.sh
  3. ├── shell.sh
  4. └── swbuilder
  5.     ├── build_docker_image.sh
  6.     ├── install_swbuilder.dockerfile
  7.     └── scripts
  8.         └── run_build.sh

請注意,我上面特意沒列出 example_workdir,但你能在教程存儲庫中找到它。實際的源碼通常存放在單獨的存儲庫中,而不是構建工具庫中的一部分;本教程為了不必處理兩個存儲庫,所以我將它包含在這個存儲庫中。

如果你只對概念感興趣,本教程并非必須的,因為我將解釋所有文件。但是如果你繼續(xù)本教程(并且已經安裝 Docker),首先使用以下命令來構建容器鏡像 swbuilder:v1

  1. cd dockerize-tutorial/swbuilder/
  2. ./build_docker_image.sh
  3. docker image ls  # resulting image will be swbuilder:v1

然后調用 build.sh

  1. cd dockerize-tutorial
  2. ./build.sh ~/repos/dockerize-tutorial/example_workdir

下面是 build.sh 的代碼。這個腳本從容器鏡像 swbuilder:v1 實例化一個容器。而這個容器實例映射了兩個卷:一個將文件夾 example_workdir 掛載到容器內部路徑 /workdir 上,第二個則將容器外的文件夾 dockerize-tutorial/swbuilder/scripts 掛載到容器內部路徑 /scripts 上。

  1. docker container run                              \
  2.     --volume $(pwd)/swbuilder/scripts:/scripts    \
  3.     --volume $1:/workdir                          \
  4.     --user $(id -u ${USER}):$(id -g ${USER})      \
  5.     --rm -it --name build_swbuilder swbuilder:v1  \
  6.     build

另外,build.sh 還會用你的用戶名(以及組,本教程假設兩者一致)去運行容器,以便在訪問構建輸出時不出現文件權限問題。

請注意,shell.shbuild.sh 大體上是一致的,除了兩點不同:build.sh 會創(chuàng)建一個名為 build_swbuilder 的容器,而 shell.sh 則會創(chuàng)建一個名為 shell_swbuilder 的容器。這樣一來,當其中一個腳本運行時另一個腳本被調用也不會產生沖突。

兩個腳本之間的另一處關鍵不同則在于最后一個參數:build.sh 傳入參數 buildshell.sh 則傳入 shell。如果你看了用于構建容器鏡像的 Dockerfile,就會發(fā)現最后一行包含了下面的 ENTRYPOINT 語句。這意味著上面的 docker container run 調用將使用 buildshell 作為唯一的輸入參數來執(zhí)行 run_build.sh 腳本。

  1. # run bash script and process the input command
  2. ENTRYPOINT [ "/bin/bash", "/scripts/run_build.sh"]

run_build.sh 使用這個輸入參數來選擇啟動 Bash shell 還是調用 gcc 來構建 helloworld.c 項目。一個真正的構建系統(tǒng)通常會使用 Makefile 而非直接運行 gcc

  1. cd /workdir
  2.  
  3. if [ $1 = "shell" ]; then    
  4.     echo "Starting Bash Shell"
  5.     /bin/bash
  6. elif [ $1 = "build" ]; then
  7.     echo "Performing SW Build"
  8.     gcc helloworld.c -o helloworld -Wall
  9. fi

在使用時,如果你需要傳入多個參數,當然也是可以的。我處理過的構建系統(tǒng),構建通常是對給定的項目調用 make。如果一個構建系統(tǒng)有非常復雜的構建調用,則你可以讓 run_build.sh 調用 workdir 下最終用戶編寫的特定腳本。

關于 scripts 文件夾的說明

你可能想知道為什么 scripts 文件夾位于目錄樹深處而不是位于存儲庫的頂層。兩種方法都是可行的,但我不想鼓勵最終用戶到處亂翻并修改里面的腳本。將它放到更深的地方是一個讓他們更難亂翻的方法。另外,我也可以添加一個 .dockerignore 文件去忽略 scripts 文件夾,因為它不是容器必需的部分。但因為它很小,所以我沒有這樣做。

簡單而靈活

盡管這一方法很簡單,但我在幾個相當不同的構建系統(tǒng)中使用過,發(fā)現它相當靈活。相對穩(wěn)定的部分(例如,一年僅修改數次的給定工具集)被固定在容器鏡像內。較為靈活的部分則以腳本的形式放在鏡像外。這使我能夠通過修改腳本并將更改推送到構建系統(tǒng)存儲庫中,輕松修改調用工具集的方式。用戶所需要做的是將更改拉到本地的構建系統(tǒng)存儲庫中,這通常是非常快的(與更新 Docker 鏡像不同)。這種結構使其能夠擁有盡可能多的卷和腳本,同時使最終用戶擺脫復雜性。

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2023-09-19 10:00:34

Linux虛擬

2010-06-09 16:27:30

PHP+MySQL

2021-03-05 00:06:12

Docker容器內存

2022-04-26 05:55:13

容器K8s管理debug問題

2011-05-16 15:36:00

軟件測試

2022-09-07 09:19:49

Docker健康檢查

2013-07-08 17:41:53

Linux 系統(tǒng)U盤格式化

2010-02-03 15:09:13

Python 構建工具

2011-04-13 08:49:33

DataSet強類型化

2019-04-11 17:57:22

容器互聯網公司開發(fā)

2023-10-09 09:27:33

Docker容器

2021-01-05 08:39:51

容器前端流水線

2017-04-17 14:40:11

虛擬化服務器內存

2017-03-28 15:30:51

服務器虛擬化內存

2020-07-07 13:00:00

Linux壓力測試

2021-07-09 05:25:48

CIO遺留系統(tǒng)現代化用戶體驗

2021-05-13 09:07:03

容器云環(huán)境鏡像

2022-07-31 23:56:23

Magecart網絡攻擊

2009-10-22 09:32:51

ghostlinux系統(tǒng)備份

2022-05-26 07:33:48

Pod容器debug
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线观看一区 | 亚洲一区二区三区在线视频 | 久久精品国产一区二区电影 | 日本亚洲一区 | 亚洲视频一区二区三区 | a级片www| 亚洲国产精品成人无久久精品 | 久久99精品久久久久久琪琪 | 中文字幕国产精品 | 玖玖视频免费 | 99精品视频在线观看免费播放 | 色在线免费视频 | 91 在线| 国产成人精品一区二区三区四区 | 亚洲精品68久久久一区 | 欧美在线亚洲 | 99精品99 | 高清成人免费视频 | 国产探花在线精品一区二区 | 欧美二区三区 | 亚洲一区日韩 | 久久久久国色av免费观看性色 | 成人小视频在线观看 | 99精品在线免费观看 | 一区二区av在线 | 亚洲成人av | 天天色图 | 一区二区三区欧美 | 精品久久香蕉国产线看观看亚洲 | a在线观看 | 欧美国产日韩在线观看成人 | 亚洲狠狠| 羞羞视频在线观看 | 欧美福利精品 | 久久久九九 | 成人在线视频一区 | 久久香蕉精品视频 | 91精品国产91久久久久久不卞 | 三级视频久久 | 国产一区二区三区精品久久久 | 91精品亚洲|