“docker-app”實用工具分享,大大提高 Compose 文件復用率

screenshot

本文首發自“Docker公司”公眾號(ID:docker-cn)
編譯丨小東
每周一、三、五 與您不見不散!


Docker Compose 在開發人員中非常流行,它用來描述應用程序。目前,GitHub 上有超過30萬個 Docker Compose 文件。通過在 docker-compose.yml 文件中對一組服務進行描述,就可以在 Docker 上用一條命令輕松的啟動一個復雜的多服務應用程序(或簡單的單服務應用程序)。這種易用性使得 Docker Compose 非常適合開發團隊快速開展項目。

隨著時間的推移,Compose 不斷發展并添加了許多功能可以在將相同的應用程序部署到生產環境時提供幫助,例如,指定大量副本、內存資源限制或自定義系統日志服務器。但這些屬性可能會跟您自己的環境有所差異。有許多不同的策略來解決這個問題,但是最常見的就是依賴于復制和粘貼。例如,為在不同環境中運行的同一應用程序維護多個 Compose 文件是相當常見的,但這會導致了兩個問題:

  • 我們一直都在分享 Docker 鏡像,但卻沒有一個很好的方法來共享使用它們的多服務應用程序;
  • 開發人員和運維人員很難圍繞 Compose 文件進行協作。這淡化了在代碼中描述應用程序的其中一項關鍵優勢 —— 即開發人員和操作人員使用同一個 Compose 文件的機會,并在產品投入生產之前捕獲配置問題;

介紹 docker-app

解決這個問題的一種方法是通過構建一個與 Compose 相輔相成的工具來使它更容易用于共享和協作。請注意,這是實驗性的,還有很多工作正在進行中,但我們希望獲得早期采用者的反饋和意見,這會:

  • 使基于Compose 的應用程序可以共享在 Docker Hub 和 DTR 上;
  • 支持在應用程序描述和每個環境設置之間更緊密的關注點分離;

該實現包含一些額外的元數據文件和一個小型命令行工具。讓我們來舉個簡單的例子。

使用下面的 Compose 文件。它啟動一個HTTP服務器,當觸發配置的端口時,它會顯示出指定的文本。

version: '3.6'services:hello:image: hashicorp/http-echocommand: ["-text", "hello world"]ports:- 5678:5678

用 docker-app 命令安裝,讓我們基于這個 Compose 文件創建一個應用程序包:

$ docker-app init --single-file hello$ lsdocker-compose.ymlhello.dockerapp

這個應用程序包只是一個文本文件(或者是一個目錄),在這個例子中叫做 hello.dockerapp。它包含三個YAML文檔:

  • 一些元數據
  • Compose 文件
  • 應用程序的一些設置

它應該是這樣的:

# This section contains your application metadata.version: 0.1.0name: hellodescription: ""maintainers:- name: yourusernameemail: ""targets:swarm: truekubernetes: true--# This section contains the Compose file that describes your application services.version: '3.6'services:hello:image: hashicorp/http-echocommand: ["-text", "hello world"]ports:- 5678:5678--# This section contains the default values for your application settings.{}

讓我們編輯設置部分(替換 {})并為我們的應用程序添加以下默認值:

port: 5678text: hello developmentversion: latest

然后修改 Compose 文件部分,添加一些變量:

version: '3.6'services:hello:image: hashicorp/http-echo:${version}command: ["-text", "${text}"]ports:- ${port}:5678

最后,您可以通過使用所提供的默認值渲染 Compose 文件來進行測試。

$ docker-app renderversion: "3.6"services:hello:command:- -text- hello developmentimage: hashicorp/http-echo:latestports:- mode: ingresstarget: 5678published: 5678protocol: tcp

請注意,這些變量已經被設置值替換。之后,您可以像使用其他 Compose 文件一樣來使用該 Compose 文件了。您可以將其保存到磁盤或 Docker 應用棧中亦或是使用 docker-compose 命令來啟動應用程序。

$ docker-app render | docker-compose -f – up

這就是它有趣的地方。我們可以在運行時使用 --set 選項來覆蓋這些設置。讓我們指定不同的選項并再次運行渲染:

$ docker-app render --set version=0.2.3 --set port=4567 --set text="hello production"version: "3.6"services:hello:command:- -text- hello productionimage: hashicorp/http-echo:0.2.3ports:- mode: ingresstarget: 5678published: 4567protocol: tcp

請注意在生成的 Compose 文件中對端口和版本進行更改。

如果你愿意,你可以創建一個獨立的配置文件來存儲這些設置。 讓我們用以下內容創建prod.yml

version: 0.2.3text: hello productionport: 4567

然后,您可以使用該配置文件顯示 Compose 文件,如下所示:

$ docker-app render -f prod.yml

這樣就可以很容易地為不同的環境單獨的設置文件了,從而減少了復制整個 Compose 文件的需要。

如果您想要超越hello world,我們還準備了一些更高級的例子。

您可以在 Docker Compose 中使用環境變量支持來實現與上述類似的內容,但需要您自己編寫工具來提供一個不錯的用戶界面。有了上述慣例,我們可以在上面創建更有趣的東西。 例如,我們可以構建相當有趣的自省工具,就像下面所示的那樣,我們計劃將簡單的變量替換轉換為更復雜的模板。


檢查和部署應用程序包

docker-app 命令不僅提供了用不同設置來渲染 Compose 文件的方法。它還提供了一些實用工具來與它們進行交互。例如,如果有人給你一個 .dockerapp,這時你可以很容易地了解它的信息,特別是在運行時發現哪些設置是可用的,而不需要讀取任何包代碼。

$ docker-app inspecthello 0.1.0Maintained by: garethA hello world example of a Docker application package.Setting Default------- -------port   8080text   hello worldversion latest

一旦準備好部署應用程序的一個版本,您就可以使用子命令進行部署了。它的工作方式與 docker 應用棧的部署命令完全相同,因此您應該很熟悉這一點。例如,如果您使用的是Docker Desktop 或 Docker EE,那么您就可以將應用程序部署到 Kubernetes,同時覆蓋一些暴露的設置。

$ docker-app deploy --set port=4567 --orchestrator=kubernetes

docker-app 還有很多實用的工具,你可以在內置的幫助信息中找到,或者等待后續的文章推送。


感興趣嗎?

如果您感興趣的話,可以瀏覽 https://github.com/docker/app 來訪問 GitHub 倉庫。您將會看到基本的文檔和幾個示例,以及下載最新版本(針對Windows、macOS或Linux)和應用程序源代碼的說明。如果您在有任何問題、想法都可以在這個鏡像倉庫中提交給我們。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451344.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

9.11學習筆記

備注&#xff1a; <span class"kp"> <a href""></a></san>a 是特殊的 要改變a里面的顏色&#xff0c;必須直接給a設置&#xff0c;給a的父級設置不行 屬性繼承&#xff1a;明明是父級上設置樣式&#xff0c;結果后代標簽也跟著發生…

bootstrap-validator 驗證一個標簽同時驗證另一個指定標簽

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 如圖 驗證 str_atBeginDate 同時把 str_atTermDate 也作一次驗證&#xff1a; 注意 紅框中 " value “ 不能少&#xff0c;我之…

solr基本查詢和高級查詢

查詢參數常用&#xff1a; q - 查詢字符串&#xff0c;必須的。fl - 指定返回那些字段內容&#xff0c;用逗號或空格分隔多個。start - 返回第一條記錄在完整找到結果中的偏移位置&#xff0c;0開始&#xff0c;一般分頁用。rows - 指定返回結果最多有多少條記錄&#xff0c;配…

送給“苦逼”的IT人系列

送給“苦逼”的IT人系列1&#xff1a;IT人的“錢”景以及收入的兩道坎 雖然IT工作五花八門&#xff0c;而且年紀有老有少&#xff0c;但IT人的收入總體還是比較有規律的&#xff0c;很明顯的可以看出有兩道坎&#xff0c;分別是10W&#xff0c;和30W&#xff0c;當然&#xff…

銳動SDK應用于行車記錄儀

方案架構手機端直播與錄播功能忠實記錄旅途中各種突發事件&#xff0c;還原事實真相&#xff0c;與家人和朋友分享沿途美景&#xff0c;一同感受美妙之旅。強大的視頻編輯功能&#xff0c;像編輯圖片一樣給視頻添加各種濾鏡&#xff0c;配音&#xff0c;配樂&#xff0c;標題文…

Angular4 存儲訪問路由棧信息

一、實現方法1.可以通過路由守衛&#xff0c;可以給父級路由添加&#xff0c;若無父級路由&#xff0c;則需要每個路由都需要添加守衛&#xff0c;即每個頁面都需要調該方法例如&#xff1a;jdb-app端上的tool.service.ts是每個頁面都會調取的方法&#xff0c;可以將監聽路由函…

python基本語法:字典

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、數據類型和對應符號&#xff1a; 元組 ( ) 列表 [ ] 字典 { } 二、字典是python中唯一的映射類型&#xff08;哈希表&#xf…

網址URL中特殊字符轉義編碼

字符 - URL編碼值 空格 - %20" - %22# - %23% - %25& - %26( - %28) - %29 - %2B, - %2C/ - %2F: - %3A; - %3B< - %3C - %3D> - %3E? - %3F - %40\ - %5C| - %7C…

無病呻吟系列

無病呻吟1&#xff1a;給應屆生的話 講到第一份工作&#xff0c;自然要給應屆畢業生一點建議。 其實這不是我的初衷&#xff0c;寫這篇文章的主要目的&#xff0c;是給那些工作了3,5年&#xff0c;正進入迷茫期或已經進入迷茫期的人看的。至于應屆畢業生&#xff0c;我想&…

JavaScript實現向OL列表內動態添加LI元素的方法

2019獨角獸企業重金招聘Python工程師標準>>> <script type"text/javascript"> function addItem() {var myitem document.getElementById("ItemToAdd").value;var mylistItems document.getElementById("mylist");var newP …

【blockly教程】第五章 循環結構

在這里&#xff0c;我們將介紹一個新游戲--Pond Tutor 在Pond Tutor(https://blockly-games.appspot.com/pond-tutor)這個游戲中&#xff0c;我們將扮演黃色的鴨子&#xff0c;通過不斷的發炮彈去攻擊紅色的鴨子&#xff0c;當紅色的鴨子血條減為0時則玩家獲勝。在這個游戲中為…

數據的PB級別是什么?

PB是數據存儲容量的單位&#xff0c;它等于2的50次方個字節&#xff0c;或者在數值上大約等于1000個TB。”一提到數據量級&#xff0c;人們通常會聯想到美國國會圖書館&#xff0c;德勤、麥肯錫、IBM、Gartner和移動廣告公司。Adfonic的數據專家向TechTarget記者介紹了PB級數據…

js 獲取字符串最后一位的4種方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 方法一&#xff1a;運用String對象下的charAt方法 charAt() 方法可返回指定位置的字符。 復制代碼代碼如下:str.charAt(str.length – …

360董事長周鴻祎跨足手機市場是福還是禍?

編者按&#xff1a;奇虎360董事長周鴻祎做的這個“思考了半年”的決定&#xff1a;進軍智能手機&#xff0c;是于5月4日夜10時45分。他所發布新浪微博稱&#xff1a;“現在每個人都想擁有高性能的智能手機&#xff0c;高富帥白富美人手一iPhone&#xff0c;難道吊絲只能買便宜低…

3 .6 .5 優化Ad-Hoc工作負載

執行計劃生成后會存儲在plan cache中&#xff0c;以便重用&#xff0c;如果計劃緩存從來都沒有被重用 過&#xff0c;將會造成內存資源的浪費&#xff0c;這有可能是由于非參數化的Ad-hoc (即席查詢&#xff09;引起的。 當執行代碼時&#xff0c;會產生一個hash值&#xff0c;…

LightOJ - 1422 (區間DP)

題意&#xff1a;有t組數據&#xff0c;對于每組&#xff0c;有n個聚會需要參加&#xff0c;下面依次是參加各個聚會需要的衣服編號&#xff0c;要求所需要的衣服一定穿在外面&#xff0c;在操作的時候&#xff0c;可以選擇穿上一件衣服或脫下一件衣服&#xff0c;脫下的衣服不…

python判斷字典,列表,元組為空的方法。

m1 []m2 ()m3 {}判斷他們為空的方法是什么&#xff1f; if m1:非空else:空if not m2: 空 else:非空False,0,,[],{},()都可以視為假

解決 JSP 頁面報錯 equal symbol expected

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.報錯&#xff1a;org.apache.jasper.JasperException: /WEB-INF/jsp/op/settlement/spRateModify.jsp(368,110) equal symbol expecte…

表單隱藏域與display:none

有時候前端進行表單填寫是分步驟的&#xff0c;每一步的時候其他步驟相關的表單視圖不可見&#xff1b; 針對"不可見"&#xff0c;以下有兩種處理方式&#xff1a; ①display&#xff1a;none 這種方式呢&#xff0c;比較簡單&#xff0c;就是將三個步驟分3個div&…

視頻領域的Instagram:Viddy用戶突破2600萬

北京時間5月9日消息&#xff0c;據TheNextWeb報道&#xff0c;視頻分享應用Viddy的注冊用戶數量已經達到2600萬&#xff0c;而上個月的用戶數量還是650萬。日均增長用戶超過50萬&#xff0c;成績斐然&#xff0c;投資者對Viddy目前的增長表示很滿意。 Viddy是如何達到這樣的成…