使用云原生buildpacks将你的代码转换成Docker Image | 技术头条


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!


当我们在大概七年前将buildpack技术开源的时候,我们就知道这项技术将大大简化应用的发布过程。当一个开发人员要跑一个:git push heroku master的时候,一个buildpack就可以保证所有的依赖以及编译工作都会作为发布的一部分被全权打理好。


如之前所宣布,我们正在将buildpacks之所以如此成功的哲学理论运用到创立云原生buildpacks(CNB),一种再也不需要dockerfile并将源代码转换为Docker Image的标准。在这篇文档里,我们会简单地看一下CNB 是如何工作的,它是如何旨在解决许多现存dockerfile上的问题, 以及你如何可以将它和最近发布的 buildpacks.io 项目 beta版本一起使用。作为这次发布的一部分,我们已经给 Ruby, Node.js, Java, Python, PHP, 以及Go建立好了可以使用CNB 工具的Heroku buildpacks builder image

 

我们先从创造一个稻草人(假设模型)开始。我们会通过一些比较冗长无聊但却很根本且必须的步骤来创建一个Ruby on Rails 应用的Dockerfile。

 

抽象泄露:递增地来写一个Dockerfile

 

大多开发者以写一个dockerfile 来使用Docker,这个file会定义整个生成Docker image的build流程。比如说, 你手里有一个的Rails 项目,并且你希望将它以一个Docker Container来发布。你会需要从一个基本的Ruby Image 开始, 将其他额外需要的包加入进来,以此来让你的应用跑起来。如果你从未用过Docker,你可能要先学几样东西才能到这一步。


FROM ruby

RUN apt-get update -qq \

  && apt-get install -y nodejs libpq-dev build-essential

COPY . /app

WORKDIR /app

RUN bundle install

RUN bundle exec rake assets:precompile

EXPOSE 5000

CMD bin/rails s

 

除了Ruby以外,一个Rails应用的Docker image 也将会需要几个额外的 Apt包。要想跑用来预编译assets的必须要的工具, node js  runtime一定要被包含在其中;为了要和PostgreSQL 交流, libpq-dev也是需要的;以及为了让gcc能够给Ruby gems build原生的插件(一个Ruby包管理器,类似Python的 pip),我们还会需要到build-essential

 

一个Dockerfile 已经足够用来在生产环境跑一个简单的Rails应用,但是整个image会充满很多非相关的缓存文件夹。你或许会想去掉那些文件,以缩减整个image大小,但这只会对本地有序性build有用。


RUN apt-get update -qq \

  && apt-get install -y nodejs libpq-dev build-essential \

  && apt-get clean autoclean && apt-get autoremove -y \

  && rm -rf /var/lib/apt /var/lib/dpkg /var/lib/cache /var/lib/log

# ..

RUN bundle exec rake assets:precompile

  && rm -rf /app/tmp/cache/assets/

 

这便突出了使用Dockerfile在速度上的短板。它并不能适当利用那些缓存目录,只因为一次rebuild就会要把整个image从头build。然而,我们可以利用些聪明的小技巧来缓存依赖(dependency)的信息来加速builds。相比较每次复制整个应用,你可以如下选择性地加入文件。


ADD Gemfile /app/

ADD Gemfile.lock  /app/

RUN bundle install

 

复制加入Gemfile 和Gemfile.lock 可以用来取代dockerfile的缓存机制,以此来防止因为仅你更改了一行代码而导致所有的缓存失效。

 

这些例子仅强调出了“几个” 当使用Dockerfile构建应用时的挑战和难点。而且你会在每次使用Dockerfile构建应用时都会重复遇见这些困难。多数情况下,最后你都会复制粘贴某个应用Dockerfile 的一部分到另外一个应用的Dockerfile,而这种行为会潜在地造成维护人员噩梦。

 

维护,是Dockerfile最大的短板。除了复制粘贴代码,它给你带来了一些如果你不使用Dockerfile是绝对不会关心的低等级问题。举例来说,和很多其他编程语言一样,Ruby有很多基本image 可以给你用来继承使用,而且每个image都有自己的大小和安全性考量。如果有一天,Rails的生态系统系要一个新的依赖(dependency),而这个新的依赖并不存在于你现有的Dockerfile,那你就要负责根据需要更新相关的设置。如果你把你的项目分拆成多个“微服务”(microservices),同时也意味着你需要在多个位置更新你的文件。


最终来说,Dockerfile是个具有漏洞性的抽象概念。它强制开发者们要小心运作上,以及平台的需要注意点,而在这之前这些需要注意点都已经被平台抽象打理了。要想写出一个好的Dockerfile,你就必须理解底层机制,以及产生image的每一步是如何工作的并以此来打理未来的更新。


所有的这些问题都源于Dockerfile缺少对应用的相对了解。如果没有你的应用相关或所使用架构的上下文相关信息,开发者如何开发和他们使用的工具就会产生巨大的不匹配现象。


像这样将运行和应用的关注点混合在一起就相当于给了一个希望尽量容易去写代码以及运输代码的开发者一个非常差的工具。基于此类不足之处,我们接下来看一下另外一种可以减少此类复杂度的替代办法。


Buildpacks学习


如果你曾经使用Heroku来发布你的应用你就会知道,这就像在本地跑一个 git push heroku master 一样容易。而在幕后,一个 buildpack 就会收集依赖(retrieve dependencies),运行数据信息,打理缓存,并且给你的应用语言编译代码。举例来说,有一个Rails 应用。Ruby的buildpack就会安装Ruby和 bundler(一个Ruby的依赖管理应用)。你的gem(一系列包和文件的总称)依赖会被提取出来,你的资源代码会被编译,而且缓存也会被清理干净:


git push heroku master

remote: Compressing source files... done.

remote: Building source:

remote: -----> Ruby app detected

remote: -----> Compiling Ruby/Rails

remote: -----> Using Ruby version: ruby-2.6.0

remote: -----> Installing dependencies using bundler 1.15.2

remote:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment

...

remote:        Bundle complete! 18 Gemfile dependencies, 61 gems now installed.

remote:        Gems in the groups development and test were not installed.

remote:        Bundled gems are installed into `./vendor/bundle`

remote:        Removing bundler (1.15.2)

remote:        Bundle completed (42.62s)

remote:        Cleaning up the bundler cache.

...

remote:        Asset precompilation completed (3.72s)

remote:        Cleaning assets

remote:        Running: rake assets:clean

remote: -----> Detecting rails configuration

remote: -----> Compressing...

remote:        Done: 41.3M

remote: -----> Launching...

remote:        Released v6

remote:        https://myapp.herokuapp.com/ deployed to Heroku

remote:

remote: Verifying deploy... done.

 

一个Buildpack以识别你应用代码语言的行为惯例帮你自动处理了这些步骤。Builpacks的设计原则就是就是安装并设置所有需要的设置以帮你达到运行你的应用的目的。站在云原生Buildpacks的角度来说,我们希望利用Docker和现代container标准,有一个相似的系统来让我们的开发者更加注重于他们的应用,而不是拼凑一个build管道。

 

运行云原生Buildpacks


因为希望能够将 Buildpacks 的简洁性和可用性与container的优势结合起来,我们开发了云原生Buildpacks(CNB),它可以产出一个 “开放容器计划”兼容(OCI-Compliant)image, 并且这个image可以使用现存 的Docker 工具,以及更广阔的现存容器生态系统。


Buildpacks.io项目是一个让我们愿景成可能的开源工具之家。其中,第一个工具便是 pack build,其行为和git push heroku master非常相似。你可以在任意资源库下产生一个Docker image。以下便是一个在Rails应用上跑的Heroku云原生buildpack的例子。

 

和buildpack产生可执行的压缩文件(slug)很相似, 一个CNB会根据你现有项目的文件识别什么东西需要被安装。你不需要进行任何配置来识别确认你的应用的需求。因为buildpack 是应用感知的(app-aware),它能够精准地捕捉到你所使用的编程语言以及你应用的所需依赖,在build阶段也同样会有着合理的系统默认值来处理内存的使用和处理并发。

 

CNB 进程在产生最后image的进行的步骤和现存Heroku Buildpacks运作的不同阶段非常相似:


· CLI 侦测到你的项目使用的主要语言。比如说,如果你的源代码目录下有一个Gemfile,那么CNB就会将它识别为一个Ruby项目;如果有个pom.xml那么它就会被识别为一个Java项目,以此类推。


· 之后,执行环境会分析之前的build来确认其中是否有任何步骤可以在接下来build中使用。


· CNB开始跑build,下载所需的依赖以及将应用准备好可以在production当中运行。


· 最后,它会将以上build的结果以Docker image的形式导出。

 

产出一个image的底层幕后进程全权被buildpack所打理。如果这个进程需要被更新-比如有个漏洞被检测到-你可以很轻松地获取一个新的工具链并且用 pack rebase重新build一个image来更新你的image而不用从头开始build一个image, 整个过程花费不到一秒钟。和用Dockerfile在你每一个应用上rebuild相比(一个可能耗费几个小时的过程),这会节省大量的时间。

 

现在就来试一下云原生Buildpacks吧!

 

再也没有比现在更好的时机来尝试一下云原生Buildpacks(CNB)了。这个项目刚刚出了它第一个beta 版本, 它已经准备好被你使用,也希望到你的反馈!

如何开始呢?先下载 pack CLI 并且在你的应用源代码目录下使用我们任一buildpack(Ruby,  Node.js, Java, Python, PHP, Go)。

 

$ pack build --builder heroku/buildpacks <docker image name>

来Slack上加入我们!如果你还想生成你自己的OCI Images,我们还有定义了使用细则的buildpack API文档 。


Heroku 一直以来都认为切合开发者的关注和需求是非常重要的:即他们应用的源代码。我们相信云原生Buildpacks 会因为以建立了基于容器的应用而帮助减少在运行维护上的复杂度,从而解放了开发者双手来专注于给他们的用户创作更多优秀的的功能和特性。

 

640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • Elastic Jeff Yoshimura:开源正在开启新一轮的创新 | 人物志

  • 深入浅出Docker 镜像 | 技术头条

  • 19岁当老板, 20岁ICO失败, 21岁将项目挂到了eBay, 为何初创公司如此艰难?

  • 码二代的出路是什么?

  • 机器学习萌新必备的三种优化算法 | 选型指南

  • 小程序的侵权“生死局”

  • @996 程序员,ICU 你真的去不起!


640?wx_fmt=png真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt设置鼠标追踪后,鼠标还是需要点击后才能变样式

引言 鼠标在窗口的四个边和四个角后会显示不同的样式。在构造函数中设置了鼠标追踪&#xff0c;但是鼠标依然需要点击后才能改变样式&#xff0c;究其原因是只设置了父窗口的鼠标追踪&#xff0c;没有设置子控件的追踪&#xff0c;当然是子控件与父窗口的鼠标追踪有关才需要设…

Docker镜像备份与迁移

文章目录1. 将容器备份成镜像2. 将镜像备份成本地文件3.从本地加载备份文件恢复镜像1. 将容器备份成镜像 用centos镜像创建一个名称为mycentos的容器 docker run -id --namemycentos centos:7查看所有容器 docker ps -a将容器mycentos保存为镜像 docker commit mycentos my…

明星企业内推+BAT面经,长三角的开发者联合起来!

戳蓝字“CSDN云计算”关注我们哦&#xff01;“为什么公司宁愿花20K招新人&#xff0c;也不愿给老员工加到20K&#xff1f;”这个热门的微博话题戳起了很多人的痛处&#xff0c;但根据 CSDN &《程序员》杂志发布的「中国软件开发者薪资调查报告」&#xff0c;有32.98%的开发…

Spring4.x整合Axis1.4发布WebService服务

Spring4.x整合Axis1.4发布WebService服务 文章目录一、服务端部署1. 在web.xml文件中添加映射路径和spring监听2. 添加spring-axis.xml配置文件3. 添加server-config.wsdd配置文件4. 对外发布服务外壳类5. 添加接口类6. 添加接口逻辑实现类7. 浏览器测试二、客户端部署2.1 axis…

阿里云亚太市场份额第一;AWS宣布在香港推出新区域;Facebook出成绩单;微软在美国西部开建第五个大型云平台...

戳蓝字“CSDN云计算”关注我们哦&#xff01;重磅先知 Gartner&#xff1a;阿里云亚太市场份额第一AWS宣布在香港推出新的区域一直在水逆的Facebook出成绩单微软在美国西部开建第五个大型云平台重磅快报Gartner&#xff1a;阿里云亚太市场份额第一4月24日&#xff0c;市场研究…

1s完成 大文件分割方案

按行数分割方案&#xff1a; 执行命令&#xff1a; split -l 1000 i.txt -d -a 4 gblfy_格式&#xff1a;split -l 行数 文件名 -d -a 4 gblfy_ 解析&#xff1a; 1、每个文件1000行(-l 1000)&#xff1b; 2、文件名称后缀系数不是字母而是数字&#xff08;-d&#xff09;&…

git通过指令查看某一个已经修改的文件的改动

方法 提交文件的时候提示文件发生了变动&#xff0c;这时若是要查看文件具体发生了什么变动&#xff0c;只需在命令行输入下述指令便可&#xff1a;git diff 文件名。 上面截图中可以通过git status来查看该项目中各文件的状态&#xff0c;可以看到文件 modified: SceneModule…

开发者如何写好技术简历?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;文章来源一位实验室朋友的投稿&#xff0c;斩获BAT头条等公司的offer,金三银四一份漂亮…

Linux系统查看文件中关键词出现的次数

在Linux系统中的文件目录下&#xff1a; 执行以下命令&#xff1a; grep -o KeyWord 03.txt | wc -l格式&#xff1a;grep -o ‘关键词’ fileName | wc -l 注&#xff1a; ‘KeyWord’是指定的关键词&#xff1b; 03.txt是指定的文本 | wc -l是统计次数

设计模式--中介者模式

实验19&#xff1a;中介者模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解中介者模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用中介者模式解决实际问题。 [实验任务]&#xff1a;虚拟聊天室 在“虚拟聊天…

qt自定义窗口,其绘制的窗口边框线显示不全

引言 自定义窗口&#xff0c;该窗口包含标题栏&#xff0c;默认整个窗口的边框线为蓝色&#xff0c;当点击该窗口的时候&#xff0c;窗口的边框线便为红色。程序在运行的时候&#xff0c;窗口的边框线只显示了左右两边的线&#xff0c;没有显示上下边的线。 示例 效果&#…

防火墙contos6.8操作手册

一、基本操作&#xff1a; 查看防火墙状态 service iptables status 停止防火墙 service iptables stop 启动防火墙 service iptables start 重启防火墙 service iptables restart 永久关闭防火墙 chkconfig iptables off 永久关闭后重启 chkconfig iptables on 二、查看…

漫画:996的本质是什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;从前&#xff0c;有一个卖苹果的小贩&#xff0c;小贩每天都能拥有24个神奇的苹果。他…

qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形

引言 创建一个基于QDialog的项目&#xff0c;自动生成ui文件&#xff0c;此时再添加新文件&#xff0c;创建一个基于QWidget的ui类&#xff0c;此类具有自定义标题栏&#xff0c;让该自定义类显示在窗口Dialog上&#xff0c;一开始具有红色的边框线&#xff0c;且四角围绕四个…

1分钟 Zookeeper 快速入门_windows环境

下载zookeeper 官网链接:https://zookeeper.apache.org/ 修改conf/zoo.cfg 文件名

跳槽季:跳和不跳之外的第三选择

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;珍妮兔转自&#xff1a;轻松做软件每年的这个时候&#xff0c;都是跳槽的黄金季节。很多公司的招聘计划&#xff0c;也是在这个时间启动。今年的“跳槽季”&#xff0c;氛围却与往年不同。滴滴裁员2000&#xff0c;…

Dubbo Zookeeper Quick Start

新建一个父工程 选择Maven 快速构建项目 按图操作&#xff1a; 添加子项目(服务方) 添加子项目(消费方) 一个父工程&#xff0c;2个子项目&#xff08;服务方&#xff0c;消费方&#xff09;&#xff0c;基本就完成了 在2个子项目中需要在main手动创建resour…

异构计算=未来?一文带你秒懂3大主流异构

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;Pasca来源&#xff1a;蛋蛋团&#xff08;ID&#xff1a;dandan_tuan…

Git Windows安装手册

文章目录1. 下载、安装、验证2、Next3. 选择安装位置4. 选择组件5. 创建开始菜单目录6. 选择Git使用的默认编辑器7 . Next8. 选择HTTPS传输后端9. 配置行结束转换10. Next11. 配置终端模拟器以与 Git Bash 一起使用12. git安装验证&#xff1a;1. 下载、安装、验证 git官网&am…

Nutanix,在转型的道路上越走越远 | 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;人物志&#xff1a;观云、盘点、对话英雄。以云计算风云人物为核心&#xff0c;聚焦个人成长、技术创新、产业发展&#xff0c;还原真实与鲜活&#xff01;一年多以前&#xff0c;以超融合设备厂商之名起家的Nutanix&#xff0c;开始…