“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.mzph.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是如何达到这样的成…