在Docker中构建长时间运行的脚本的一些方法
发布时间:2022-10-05 09:54:32
这篇文章主要介绍了在Docker中构建长时间运行的脚本的一些方法,Docker是目前最火爆的虚拟技术,需要的朋友可以参考下
我想我已经找到了一个非常不错的Docker使用案例。你是不是会觉得这是一篇写Docker有多好多好的文章,开始之前我想和你确认,这篇文章会介绍如何把文件系统作为持久性的数据结构。
因此,这篇文章的见解同样适用于其他的 copy-on-write文件系统,如BTRFS和ZFS。
问题
让我们从这个我试图解决的问题开始。我开发了一个会运行很长时间的构建脚本,这个脚本中包含了很多的步骤。
这个脚本会运行1-2个小时。
它会从网络下载比较大的文件(超过300M)。
后面的构建步骤依赖前期构建的库。
但最最烦人的是,运行这个脚本真的需要花很长的时间。
文件系统是固有状态
我们一般是通过一种有状态的方式与文件系统进行交互的。我们可以添加、删除或移动文件。我们可以修改文件的 权限或者它的访问时间。大部分独立的操作都可以撤销,例如将文件移动到其它地方后,你可以将文件恢复到原来的位置。但我们不会通过快照的方式来将它恢复到 原始状态。这篇文章我将会介绍如何在耗时较长的脚本中充分利用快照这一特性。
使用联合文件系统的快照
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处理它的中间镜像(快照)的方式。当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,至少你不必再从头开始。


猜你喜欢
- 三大运营商运营陆续披露上半年运营数据,从三家运营商公布的数据来看,截至 6 月 30 日,我国在网 5G 用户已经突破 1 亿大关。近日,三
- 在我们使用word办公时,如果将一些项目设计成选项按钮的模式,会有效的提高了输入速度和正确性,今天,小编就教大家在word怎么设置选项按钮的
- 近日,索尼发布了一款投影仪黑科技,这不只是能把Android手机的屏幕投射到墙上,用户还可以直接对投射的画面进行触摸操作(有点像*宝上的镭射
- 在当今社会,我们的生活似乎已经离不开音乐了,不管我们走到哪,音乐就会跟着到哪。遇到好听的音乐,我们总是会开启单曲循环,反复听。不过,最近有朋
- win8外接显示器和投影仪如何切换屏幕?其实很简单,使用Win+P组合键打开切换页面就可以切换了,下面分享win8外接显示器和投影仪相互切换
- 今天我就给大家说说excel2003桌面图标如果不见了去哪里找吧。打开开始菜单,然后程序里,有一个Microsoft OFFICE的文件夹里
- 很多小伙伴买了荣耀magicbook后发现电脑安装的系统不适合自己,就想重装win10系统,但是不知道如何操作。那接下来小编就给大家介绍一下
- PS分辨率怎么调?近期有PS新手用户想要调节图片的分辨率,那么应该如何操作呢?方法很简单,我们可以直接在ps软件中去进行更改和调整,话不多说
- cdr如何制作个性贴图?最近有小伙伴想要使用cdr制作个性贴图却不知道如何操作,那么今天小编就给大家带来cdr制作个性贴图的具体操作步骤,让
- 微软已向Windows Insider用户推送最新win10手机预览版10080更新,并公布win10手机预览版10080已知Bug汇总,其
- ppt文档是由许多张幻灯片组成的,幻灯片是由占位符组成的。占位符就是一个编辑框,原则上内容不能超过占位符,否则放映时不好看。幻灯片一般是由两
- win10专注助手顾名思义就是让你更专注手头上的事,不会被别的信息提示打断。这样一来确实更专注了,但是很错过了某些重要的提醒事项。那这个专注
- 我们要解决一个问题,如果一个域控制器我们不需要了,那应该如何处理呢?如果我们让这台域控制器直接消失,那么其他的域控制器就无法得知这个消息,每
- 咪咕爱看怎么连接宽带电视?咪咕爱看是一个视频观看平台,但是不能连接手机端,用户可以使用其和宽带电视进行连接。那么,想要咪咕爱看具体怎么投到电
- 在Excel中也跟WORD文档一样都需要进行调整段落,具体该如何调整段落呢?下面是小编带来的关于excel中调整段落的教程,希望阅读过后对你
- 微软开始推送Windows 10版本1903的7月第二次累积更新补丁Build 18362.267。在Windows Update设置页面上
- 在Win10系统中,如果对分辨率不满意,可以自行设置。但是有用户设置后出现输入不支持,导致看不到显示器系统运行,糟糕的是无法操作。这如何处理
- 许多用户在电脑系统出现一些故障的时候,往往不知道如何处理,而选择修复系统一般是可以解决大部分的问题,那么我们要怎么修复电脑系统呢?下面小编就
- 以WPS 2019版为例,打开表格,点击上方菜单栏“数据”--->“高亮重复项”--->“设置高亮重复项”。 在弹出的
- Excel我们一起学函数—提取单元格中的汉字