位置: 编程技术 - 正文

在Docker中构建长时间运行的脚本的一些方法(构建dockerfile)

编辑:rootadmin

推荐整理分享在Docker中构建长时间运行的脚本的一些方法(构建dockerfile),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:docker怎么搭建,使用docker搭建开发环境,构建dockerfile,构建dockerfile,在docker中可构建多个应用容器的方式,docker 构建,docker怎么搭建,docker 构建,内容如对您有帮助,希望把文章链接给更多的朋友!

我想我已经找到了一个非常不错的Docker使用案例。你是不是会觉得这是一篇写Docker有多好多好的文章,开始之前我想和你确认,这篇文章会介绍如何把文件系统作为持久性的数据结构。

因此,这篇文章的见解同样适用于其他的 copy-on-write文件系统,如BTRFS和ZFS。问题

让我们从这个我试图解决的问题开始。我开发了一个会运行很长时间的构建脚本,这个脚本中包含了很多的步骤。

这个脚本会运行1-2个小时。 它会从网络下载比较大的文件(超过M)。 后面的构建步骤依赖前期构建的库。

但最最烦人的是,运行这个脚本真的需要花很长的时间。文件系统是固有状态

我们一般是通过一种有状态的方式与文件系统进行交互的。我们可以添加、删除或移动文件。我们可以修改文件的 权限或者它的访问时间。大部分独立的操作都可以撤销,例如将文件移动到其它地方后,你可以将文件恢复到原来的位置。但我们不会通过快照的方式来将它恢复到 原始状态。这篇文章我将会介绍如何在耗时较长的脚本中充分利用快照这一特性。使用联合文件系统的快照

Docker使用的是联合文件系统叫做AUFS(译者注:简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统)。联合文件系统实现了Union mount。顾名思义,也就是说不同的文件系统的文件和目录可以分层叠加在单个连贯文件系统之上。这是通过分层的方式完成的。如果一个文件出现在两个文件系统,那最高层级的文件才会显示(该文件其它版本也是存在于层级中的,不会改变,只是看不到的)。

在Docker中,每一个在Union mount转哦给你的文件系统都被称为layers(层)。使用这种技术可以轻松实现快照,每个快照都是所有层的一个Union mount。生成脚本的快照

使用快照可以帮助构建一个长时运行的脚本。总的想法是,将一个大的脚本分解为许多小的脚本(我喜欢称之为 scriptlets),并单独运行这些小的脚本,脚本运行后为其文件系统打一个快照 (Docker会自动执行此操作)。如果你发现一个scriptlet运行失败,你可以快速回退到上次的快照,然后再试一次。一旦你完成脚本的构建,并且 可以保证脚本能正常工作,那你就可以将它分配给其它主机。

回过头来再对比下,如果你没有使用快照功能了?当你辛辛苦苦等待了一个半小时后,脚本却构建失败了,我想除了少部分有耐心的人外,很多人是不想再来一次了,当然,你也会尽最大努力把系统恢复到失败前的状态,比如可以删除一个目录或运行make clean。

但是,我们可能没有真正地理解我们正在构建的组件。它可能有复杂的Makefile,它会把把文件放到文件系统中我们不知道的地方,唯一真正确定的途径是恢复到快照。使用快照构建脚本的Docker

在本节中,我将介绍我是如何使用Docker实现GHC7.8.3 ARM交叉编译器的构建脚本。Docker非常适合做这件事,但并非完美。我做了很多看起来没用的或者不雅的事情,但都是必要的,这都是为了保证将开发脚本的总时间降到最低限度。构建脚本可以在这里找到。用Dockerfile构建

Docker通过读取Dockerfile来构建镜像。Dockerfile会通过一些命令来具体指定应该执行哪些动作。在我的脚本中主要用到WORKDIR、ADD和RUN。ADD命令非常有用因为它可以让你在运行之前将外部文件添加到当前Docker镜像中然后转换成镜像的文件系统。你可以在这里看到很多scriptlets构成的构建脚本。设计

1. 在RUN之前ADD scriptlets

如果你很早就将所有的scriptletsADD在Dockerfile,您可能会遇到以下问题:如果你的脚本构建失败,你回去修改scriptlet并再次运行docker build。但是你发现,Docker开始在首次加入scriptlets的地方构建!这样做会浪费了大量的时间并且违背了使用快照的目的。

在Docker中构建长时间运行的脚本的一些方法(构建dockerfile)

出现这种情况的原因是由于Docker处理它的中间镜像(快照)的方式。当Docker通过Dockerfile构建镜像时,它会与中间镜像比较当前命令是否一致。然而,在ADD命令的情况下被装进镜像的文件里的内容也会被检查。如果相对于现有的中间镜像,文件已经改变,那么Docker也别无选择,只能从这点开始建立一个新的镜像。因为Docker不知道这些变化会不会影响到构建。

此外,使用RUN命令要注意,每次运行时它都会导致文件系统有不同的更改。在这种情况下,Docker会发现中间镜像并使用它,但是这将是错误的。RUN命令每次运行时会造成文件系统相同的改变。举个例子,我确保在我的scriptlets我总是下载了一个已知版本的文件与一个特定MD5校验。

对Docker 构建缓存更详细的解释可以在这里找到。

2.不要使用ENV命令来设置环境变量,请使用scriptlet。

它似乎看起来很有诱惑力:使用ENV命令来设置所有构建脚本需要的环境变量。但是,它不支持变量替换的方式,例如 ENV BASE=$HOME/base 将设置BASE的值为$HOME/base着很可能不是你想要的。

相反,我用ADD命令添加一个名为set-env.sh文件。此文件会包含在后续的scriptlet中:

复制代码代码如下: THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source $THIS_DIR/set-env-1.sh

如果你没有在第一时间获取set-env.sh会怎么样呢?它很早就被加入Dockerfile并不意味着修改它将会使随后的快照无效?

是的,这会有问题。在开发脚本时,我发现,我已经错过了在set-env.sh添加一个有用的环境变量。解决方案是创建一个新的文件set-env-1.sh包含:

复制代码代码如下: THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source $THIS_DIR/set-env.sh if ! [ -e "$CONFIG_SUB_SRC/config.sub" ] ; then CONFIG_SUB_SRC=${CONFIG_SUB_SRC:-$NCURSES_SRC} fi

然后,在所有后续的scriptlets文件中包含了此文件。现在,我已经完成了构建脚本,我可以回去解决这个问题了,但是,在某种意义上,它会破坏最初的目标。我将不得不从头开始运行构建脚本看看这种变化是否能成功。缺点

一个主要缺点是这种方法是,所构建的镜像尺寸是大于它实际需求的尺寸。在我的情况下尤其如此,因为我在最后删除了大量文件的。然而,这些文件都仍然存在于联合挂载文件系统的底层文件系统内,所以整个镜像是大于它实际需要的大小至少多余的是删除文件的大小。

然而,有一个变通。我没有公布此镜像到Docker Hub Registry。相反,我:

使用docker export导出内容为tar文件。 创建一个新的Dockerfile简单地添加了这个tar文件的内容。

产生尺寸尽可能小的镜像。结论

这种方法的优点是双重的:

它使开发时间降至最低,不再做那些已经构建成功的子组件。你可以专注于那些失败的组件。 这非常便于维护构建脚本。构建可能会失败,但只要你搞定Dockerfiel,至少你不必再从头开始。

Docker结合自动化编排工具Fig的使用方法 Fig是一个基于Docker的用于快速搭建开发环境的工具,目前Fig团队已经加入Docker公司。Fig通过一个配置文件来管理多个Docker容器,非常适合组合使用多个

KVM或XEN虚拟机应对毒液漏洞的方法 爆毒液漏洞,是虚拟化上一个非常严重的漏洞,影响全线的基于KVM/XEN的虚拟化产品。为什么影响如此严重因为KVM/XEN的虚拟硬件采用QEMU模拟。CrowdStrike的

KVM虚拟机上关于宿主机的USB设备使用问题探究 KVMusbpassthrough就是将宿主机的usb接口直接给虚拟机使用,usb接口上的设备也就直接可以在虚拟机上使用。测试环境宿主机1centos6.位内核版本2.6.-.1.2.

标签: 构建dockerfile

本文链接地址:https://www.jiuchutong.com/biancheng/354081.html 转载请保留说明!

上一篇:将Vmware的镜像格式转换为Virtualbox的镜像格式的方法(vmware img镜像)

下一篇:Docker结合自动化编排工具Fig的使用方法(docker 自启动)

  • 可抵扣暂时性差异是指在确定未来收回资产
  • 本期收入和本期减除费用
  • 企业返聘退休人员劳务合同
  • 采购返利怎么生成发票
  • 工程收到奖励款怎么账务处理?
  • 红字发票信息表是销方还是购方开
  • 法人贷款用于公司经营的分录怎么做
  • 发票先收到下个月才付款
  • 实收资本的账务处理题目
  • 危险废物处理原则
  • 发票税额小数点后面没打印上能用吗
  • 发票红冲需要用发票打印吗
  • 资产处置收益的含义
  • 库存商品出口退税的账务处理?
  • xmp是什么格式的文件是一种预设吗
  • 公司收到加盟费怎么做会计分录
  • cmd. exe 程序错误
  • 公司注销不清算可以吗
  • ksysslim.exe是什么
  • 确认的政府补助怎么入账
  • 库存盘点差异会计分录
  • 商贸公司销货怎么做会计分录
  • php email
  • 最常用的成本核算方法表
  • 个人股权转让应税凭证名称
  • 财务费用的核算属于什么业务
  • php读取mysql
  • js如何实现异步编程
  • 给客户开的发票,在邮寄过程中丢了怎么办?
  • python搭建项目结构
  • 花生油加工厂的手续好办吗
  • 灵动cfe
  • 向分支机构支付融资利息可以扣除吗?
  • 纳税人的交际应酬消费可以抵扣进项税额
  • 个税申报数据有误
  • mysql中如何设置默认值
  • 一般纳税人商贸企业的税负是多少
  • 库存现金余额过大的风险
  • 事业单位破产清算开户流程
  • 报销餐费增值税进项税计入什么科目
  • 现金流量表中应收账款为负是什么意思
  • 销售样品分录
  • 记账凭证审核的内容
  • 银行进账单是什么样子的
  • 工会活动支出如何记账
  • 允许税前扣除的税金及附加包括哪些
  • 应收应付账款如何清理
  • 为什么购入股票是综股
  • 应交增值税明细表公式
  • 公司怎么建
  • 凭证账本是什么
  • mysql的ip怎么看
  • sql语句优化之用是什么
  • 自增字段必须是主键吗
  • win10无法删除文件夹没有权限
  • xp系统怎么关闭自动关机
  • 游戏与操作系统不兼容
  • linux如何挂载iso文件
  • 怎么安装win7系统不占硬盘空间呢
  • win8.1安装过程
  • win10系统d盘变成e盘,进入winpe盘符正常
  • win7 手动输入用户名
  • switpa.exe - switpa是什么进程
  • centos怎么安装yum源
  • win8内存管理
  • win81无线网络没有了
  • 水下摄影技巧
  • cocos2dx怎么用啊
  • jQuery扩展+xml实现表单验证功能的方法
  • unity3d基础操作
  • 实用的批处理
  • 使用驱动器u盘之前需要格式化
  • 相机调取失败
  • unity编辑器安装
  • 安全的代码
  • python模块和包的区别
  • python多进程模块
  • js 原型继承的几种方法
  • 个体办税控盘需要什么材料
  • 亿企代账和云账房哪个好用?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设