dockerfile cd目录_使用Werf和现有的Dockerfiles改善你的CI/CD体验

7635afd82586a7cb19e64cb658f8f00f.png

迟到总比不到好。该故事讲关于我们因不支持使用常规的Dockerfile来构建镜像导致我们差点犯了一个重大错误。Werf[1]是一个GitOps工具,可以很好地集成到任何CI/CD系统中,并提供完整的应用程序生命周期管理,允许你:
  • 构建和推送镜像

  • 部署应用程序到Kubernetes中

  • 根据策略清理未使用镜像

我们工具的理念是:将低级手段组合到一个统一的系统中让DevOps工程师控制应用程序。尽可能使用现有的即用型工具(如Helm和Docker)。但是如果没有合适的任务解决方案呢?答案很简单,我们自己编写并维护工具来完成工作。背景:自定义镜像构建器

5950e68f8516506124faa5ed98160313.png

Werf镜像构建器也发生了同样的故事。Dockerfile是描述构建镜像过程的事实标准,但我们的需求受到很大限制。这个问题在我们项目的早期阶段变得至关重要。在开发用于容器化应用的工具时,我们很快意识到Dockerfile不适合以下特定任务:
  1. 遵循构建典型小型Web应用程序的标准工作流程:a)安装系统范围的应用程序依赖项,b)安装特定于应用程序的库,c)构建资产(assets),d)最重要的部分,快速高效地更新镜像中的代码。

  2. 构建器在发生更改时应通过提交修补应用于修改的文件来创建新的镜像层。

  3. 如果某些文件已被修改,则必须重建依赖阶段。

这是我们一开始的需求列表,在今天我们的构建器有着许多额外的功能。总而言之,我们没花多长时间就开始使用首选编程语言开发自定义DSL(见下文)。它必须满足既定目标,根据文件描述分阶段的构建过程并确定不同阶段间的依赖。它由相应的那些可将DSL转变成最终目标的构建器,即即用型Docker镜像补充。一开始我们使用Ruby实现了DSL,在切换到Golang之后我们用YAML文件形式重写了它。

88a8d0c3805fcac690eeb9acf40cbf71.png

Werf的Ruby的配置,这是旧的版本(此时项目被称为dapp)

821328bb97b2f69e2e15d61342bada5b.png

Werf的YAML形式配置,这是现在的版本构建器的概念随时间推移一直在变化。在一开始,我们只是简单地使用我们的配置动态地生成一些临时的Dockerfile,然后我们在临时容器中运行构建指令并进行提交。注意:目前我们使用YAML配置的Stapel构建器(如上所示)已经发展成一个相当强大的工具。虽然它值得一篇文章来详细描述其本身,但你现在可以先在该文档[2]中找到更多详细信息。等一下!

5950e68f8516506124faa5ed98160313.png

不久之后,我们发现了一个严重的错误,那就是我们没有添加使用标准Dockerfiles构建镜像的能力,我们将它们集成到已建立的基础架构中以进行完整的应用程序管理(即用于构建,部署和删除镜像)。“我们怎么可能在没有支持Dockerfile的情况下打造为Kubernetes部署镜像的工具,这是否是一种描述大多数项目镜像的流行方式?”这个问题依旧困扰着我们。我们没有回答该问题,而是提出了解决方案。如果你已经有了一个Dockerfile(或一组Dockerfile)且想使用werf呢?注意:顺便问一下,你为何要使用werf?至少,它有各种很好的功能来增强和粘合你的CI/CD流程,例如:
  • 完整的应用程序管理周期,包括删除镜像

  • 在单个配置中构建多个镜像的能力

  • 改进的部署Helm兼容图表的流程

完整的功能列表请点击项目页面[3]。因此,直至最近,如果你对使用werf感兴趣,我们还希望你将Dockerfiles移植到我们的配置格式。但是现在我们很高兴地告诉你,“让werf来构建你的Dockerfiles吧!”用法

5950e68f8516506124faa5ed98160313.png

此功能的首次完整实现在werf的v1.0.3-beta.1版本引入。一般流程非常简单,即用户在werf配置中指定已存在的Dockerfile的路径,然后使用werf build命令启动werf。然后就没有然后了,werf将会构建镜像。以下是一个例子。我们在应用的根目录中定义 Dockerfile:

FROM ubuntu:18.04

RUN echo Building ...

然后我们定义 werf.yaml它将引用上面的 Dockerfile:

configVersion: 1

project: dockerfile-example

---

image: ~

dockerfile: ./Dockerfile

然后我们就可以执行werf build了:

3c3f861d846a88a2f6e870c0a684a3ef.png

顺便说下,你也可以这样定义werf.yaml以使用多个Dockerfile同时构建镜像:

configVersion: 1

project: dockerfile-example

---

image: backend

dockerfile: ./dockerfiles/Dockerfile-backend

---

image: frontend

dockerfile: ./dockerfiles/Dockerfile-frontend

Werf配置中同样支持传递额外的构建参数,例如--build-arg和--add-host等。以下是完整Dockerfile镜像配置的链接[4]。它是如何运作的?

5950e68f8516506124faa5ed98160313.png

在构建镜像期间,本地层的通用Docker缓存处于活动状态。重要的是,werf还将Dockerfile配置集成到其基础架构中。这意味着什么?
  1. 所有使用Dockerfile构建的镜像都包含一个特定的名为dockerfile的阶段。(可以在werf文档中[5]了解“阶段”相关内容)

  2. 在dockerfile阶段,werf会根据Dockerfile配置中的内容计算出签名。Dockerfile配置的改变将会引起dockerfile阶段的签名改变。在这种情况下,werf使用新的Dockerfile配置启动此阶段的重建。如果签名保持不变,则werf使用缓存的镜像。

  3. 你可是使用werf publish或werf build-and-publish发布构建出来的镜像并将其部署到Kubernetes中。已推送到Docker仓库的镜像会通过常规werf机制进行清理。这意味着旧镜像(超过N天)和与不存在的Git分支相关联的镜像将被自动删除,且可以应用其他策略。

你可以在相应的文档中了解有关这些werf特性的更多信息:
  • 发布过程[6];

  • 与Kubernetes的部署过程集成[7];

  • 清理过程[8]。

提示和警告

5950e68f8516506124faa5ed98160313.png

1. 指令ADD不支持外部URL当前ADD参数不能支持外部的URL。Werf不会启动重建过程以响应指定URL处的资源更改。我们计划很快添加此功能。2. 不能将.git目录包含到镜像中事实上,将.git目录添加到你的容器镜像中不是个好主意,原因如下:
  • .git目录在最终镜像中的存在违反了12要素应用理念。最终镜像必须与单个提交链接;不应允许其在任意提交上执行git checkout。

  • .git目录增大了镜像的体积(Git仓库可能会因为曾经添加删除过大文件而增大)。相反地,每个特定提交对工作树大小将不依赖于Git操作的历史。此外,.git目录从最终镜像中添加以及后续的删除,文件夹将不再起作用,因为无论如何都将生成新的层次(这正是Docker的工作原理)。

  • 即使正在处理相同的提交(源自不同的工作树),Docker也可能启动不必要的重建。例如,GitLab在/home/gitlab-runner/builds/HASH/[0-N]/yourproject启用并行构建时创建单独的克隆文件夹。不必要的重建是由.git同一存储库的各种克隆版本中的文件夹的差异引起的(即使我们构建完全相同的提交)。

最后一点直接影响了werf的使用。Werf需要构建缓存来运行某些命令(例如werf deploy)。执行这些命令时,werf会为werf.yaml文件中指定的镜像计算各阶段签名,因此它们必须存在于构建缓存中,否则命令将会失败。.git内容在签名阶段的依赖意味着缓存容易受到无关文件的影响,这是werf无法容忍的错误(更多细节[9])。无论如何,通过ADD和COPY指令添加特定和需要的文件仍然是一个很好的做法。它提高了创建的效率和所创建的Dockerfile的可靠性,并提高了缓存(通过上述内容构建Dockerfile)对Git中无关的更改的弹性。总结

5950e68f8516506124faa5ed98160313.png

我们为特定需求制作自定义构建器之路是艰难的,诚实的和直接的:我们倾向于使用自定义语法开发自己的解决方案,而不是将解决方法置于默认Dockerfile之上。这种方法有其优势:Stapel构建器就做得很好!但是,在创建自定义镜像构建器时,我们完全忽略了应用现有Dockerfiles的情况。这个漏洞现在已经解决了。在未来,我们计划加强对Dockerfiles的支持以及我们的定制Stapel构建器,用于分布式构建和在Kubernetes集群内构建镜像(即通过使用类似于kaniko的Kubernetes中的运行程序)。所以,如果你碰巧有一些好的Dockerfiles,不要犹豫,快来尝试werf[1]吧!相关链接:
  1. https://github.com/flant/werf

  2. https://werf.io/documentation/reference/build_process.html#stapel-image-and-artifact

  3. https://github.com/flant/werf#complete-features-list

  4. https://werf.io/documentation/configuration/dockerfile_image.html

  5. https://werf.io/documentation/reference/stages_and_images.html#stages

  6. https://werf.io/documentation/reference/publish_process.html

  7. https://werf.io/documentation/reference/deploy_process/deploy_into_kubernetes.html#integration-with-built-images

  8. https://werf.io/documentation/reference/cleaning_process.html

  9. https://werf.io/documentation/reference/stages_and_images.html

原文链接:https://medium.com/flant-com/werf-dockerfile-support-e6504211b8e6Kubernetes入实战培训

5950e68f8516506124faa5ed98160313.png

Kubernetes入门与实战培训将于2019年11月29日在深圳开课,3天时间带你系统掌握Kubernetes,学习效果不好可以继续学习。本次培训包括:云原生介绍、微服务;Docker基础、Docker工作原理、镜像、网络、存储、数据卷、安全;Kubernetes架构、核心组件、常用对象、网络、存储、认证、服务发现、调度和服务质量保证、日志、监控、告警、Helm、实践案例等等,点击下方图片或者阅读原文链接查看详情。e562fc8cb03608fc052b0ce62051e989.png

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

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

相关文章

alxc tool 报错数组超出了界限_代码审计之报错信息泄露与字符串截断

机器在语言编码转换的时候,经常会出现各种各样的异常,这些神奇的字符串就有可能组合成一堆乱码出来,也有可能直接把程序搞崩溃掉,不过总有那么一些字符,可以帮助我们在利用漏洞的时候变得更简单一些,下面我…

C语言,去你的策略模式!

前言 这里先插一点题外话,在C语言中,实现封装、继承、隐藏、多态等等特性,是完全没有问题的。但是在使用过程中,必定是不如自带这些特性的语言方便好用的,比如C \java等。一旦要通过C语言来实现各种设计模式&#xff0…

eager_EAGER的获取是代码的味道

eager介绍 Hibernate获取策略确实可以使几乎没有爬网的应用程序和响应Swift的应用程序有所不同。 在这篇文章中,我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 : 提取策略 描述 加入 原始S…

什么时候会是用treeset?_flex:1 到底代表什么?

今天在做项目的时候遇到一个关于布局的问题, 就是 flex: 1; 我一直以为 flex: 1; 代表的是 flex: aoto; 后来发现结果并不是这样, 所以写一篇博客来讲解一下 flex: 1; 代表什么代码第一版<div class"container"><div class"div">我是一个div&l…

纠缠不清的C语言位域(位段)详解

位域是什么&#xff1f;有些数据在存储时并不需要占用一个完整的字节&#xff0c;只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态&#xff0c;用 0 和 1 表示足以&#xff0c;也就是用一个二进位。正是基于这种考虑&#xff0c;C语言又提供了一种叫做位域的…

matlab画累计直方图_科学网—matlab 绘制直方图——常用命令 - 范凯波的博文

直方图上显示数值close all ,x rand(100,1);%获得直方图的数据[n,y] hist(x);maxN max(n);%设置显示x,y长度限制axis([0 1.2 0 maxN2])%根据直方图的数据绘制出图形bar(y,n);for i 1:length(y)%直方图上面数据对不齐&#xff0c;利用水平和垂直对齐 &#xff0c;可以参考se…

玩转java并发工具_玩Java并发

玩转java并发工具最近&#xff0c;我需要将一些文件&#xff08;每个文件都有JSON格式的对象列表&#xff08;数组&#xff09;&#xff09;转换为每个文件都具有相同数据&#xff08;对象&#xff09;的分隔行的文件。 这是一次性的任务&#xff0c;很简单。 我使用Java nio的…

django debug=false后静态文件丢失_python框架Django实战商城项目之工程搭建

项目说明 该电商项目类似于京东商城&#xff0c;主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。 项目开发模式采用前后端不分离的模式&#xff0c;为了提高搜索引擎排名&#xff0c;页面整体刷新采用jinja2模板引擎实现&#xff0c;…

mysql解压缩 1067_windows安装mysql8.0.0解压版附出现1067错误解决方法

1、自己到mysql官网下载mysql-8.0.0-dmr-winx64.zip解压缩安装包2、下载页面地址&#xff1a;https://dev.mysql.com/downloads/mysql/3、解压缩到任意目录(我自己是D:\DevTools\mysql-8.0.0)4、配置环境变量添加path路径为你的mysql8.0.0路径下面的bin目录(我的目录是D:\DevTo…

基于C语言的函数指针应用-消息命令处理框架

简述大家都知道&#xff0c;在C语音中指针的地位很重要&#xff0c;各种指针&#xff0c;功能很强大&#xff01;但是用不好&#xff0c;指针也比较容易出问题。这里介绍的是函数指针的一种应用方法&#xff0c;即使用函数指针来实现消息命令的注册与回调处理。代码测试的处理函…

框架中建立浮动框架_建立代理,而不是框架

框架中建立浮动框架自从引入Java注释以来&#xff0c;它已成为大型应用程序框架API的组成部分。 此类API的很好示例是Spring或Hibernate的示例&#xff0c;其中添加了几行注释代码可实现非常复杂的程序逻辑。 尽管人们可以争论这些特定API的缺点&#xff0c;但大多数开发人员都…

easyexcel 动态列_easyexcel动态表头列导出SequenceDiagram 阅读源码事半功倍

EasyExcel简介Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是…

python3进阶_Python3 进阶教程 2020全新版

REVENGE_7771天前如果不创建class类的话&#xff0c;直接使用dog.name是会报错的&#xff0c;因为一般数据类型不接受这种调用方式0赞 0采集潘某人永不屈服2天前class Student()定义的时候&#xff0c;需要在括号内写明继承的类Person在__init__()方法&#xff0c;需要调用sup…

C语言中的输入输出

在C语言中提供了许多内置的输入输出函数。标准文件的定义在C语言中会把所有设备当文件来处理。为了访问键盘和屏幕&#xff0c;以下三个文件会在程序执行时而打开。标准文件文件指针设备标准输入stdin键盘标准输出stdout屏幕标准错误stderr屏幕C 语言中的输入/输出通常使用内置…

sqlalchemy与mysql区别_sqlite3和sqlalchemy有什么区别?

sqlite3是一个嵌入式RDBMS。A relational database management system (RDBMS) is a database management system (DBMS) that is based on the relational model as introduced by E. F. Codd. Most popular commercial and open source databases currently in use are based…

lambda 延迟执行_Java Lambdas和低延迟

lambda 延迟执行总览 有关在Java和低延迟中使用Lambda的主要问题是&#xff1a; 他们会产生垃圾吗&#xff0c;您能做些什么吗&#xff1f; 背景 我正在开发一个支持不同有线协议的库。 这个想法是&#xff0c;您可以描述要写入/读取的数据&#xff0c;并且有线协议确定它是否…

C语言“悬空指针”和“野指针”究竟是什么意思?

各位&#xff0c;提起C语言我们很自然就会想到指针二字&#xff0c;没错&#xff0c;作为C的核心和灵魂&#xff0c;它的地位咱们就不再赘述了&#xff0c;今天我们想跟大家讲的是指针中的两个特有名词&#xff1a;“悬空指针”和“野指针”。悬空指针C语言中的指针可以指向一块…

grad在python什么模块_深度学习(Deep Learning)基础概念1:神经网络基础介绍及一层神经网络的python实现...

此专栏文章随时更新编辑&#xff0c;如果你看到的文章还没写完&#xff0c;那么多半是作者正在更新或者上一次没有更新完&#xff0c;请耐心等待&#xff0c;正常的频率是每天更新一篇文章。 该文章是“深度学习&#xff08;Deep Learning&#xff09;”系列文章的第一部分&…

ubuntu终端命令停止_从命令行关闭Linux计算机的5种方法

没有操作系统是完美的。 即使相对稳定,驱动程序和应用程序也可能存在问题。 Linux也不例外。 尽管比Windows更稳定(在许多情况下,并非全部!),但可能还需要重新启动Linux计算机。 这可能是因为某些东西不起作用。 或者,您可能通过SSH连接到远程计算机或服务器,并希望它重新…

C语言编写简单朗读发音小工具!!

各位&#xff0c;今天给大家带来C语言结合VBS脚本写的一个简单的朗读小工具&#xff0c;做一个能够发音的C语言程序&#xff08;保证简单&#xff0c;人人都能学会&#xff09;。具备的知识体系&#xff1a;C语言基本框架C语言输入输出C语言文件操作C语言system函数VBS指令&…