基于领域知识的Docker镜像自动构建方法
陈伟1,2, 叶宏杰1,2, 周家宏1,2, 魏峻1,2
1 中国科学院大学,北京 100190
2 中国科学院软件研究所,北京 100190
摘要:Dockerfile是构建Docker应用镜像的脚本代码,包含软件系统镜像构建所需的软件包及其依赖的下载、安装和配置的所有指令。编写Dockerfile需要丰富的领域知识,否则编写的Dockerfile容易产生镜像构建错误。针对此问题,提出一种基于领域知识的Docker镜像自动构建方法。该方法通过对大规模Dockerfile的自动解析,分析提取构建Docker镜像所需的软件依赖及安装配置等领域知识;在面向特定软件系统构建镜像时,从已构建的领域知识库中分析推断指定软件的依赖关系及安装操作,生成Dockerfile来构建Docker镜像。实验结果表明,该方法具有利用领域知识推断系统依赖关系和软件包安装方式、生成不同软件Dockerfile的能力。
关键词:Docker, Dockerfile, 知识图谱, 软件包, 系统依赖
论文引用格式:
陈伟, 叶宏杰, 周家宏, 等. 基于领域知识的Docker镜像自动构建方法[J]. 大数据, 2021, 7(1): 64-75.
CHEN W, YE H J, ZHOU J H, et al. An approach to automatically building Docker images by using domain knowledge[J]. Big Data Research, 2021, 7(1): 64-75.
1 引言
在传统软件开发过程中,开发部署和运行演化两阶段相互割裂,各阶段数据汇聚与知识提炼、关联与运用程度低,难以快速响应需求变化。为此,开发运维一体化(DevOps)被提出,旨在加强开发和运维部门之间的沟通协作,提高软件运行演化过程中生产活动的效率和质量。DevOps的引入对软件产品的开发、测试、交付和运维有重要意义。
Docker是当前主流的容器技术,在DevOps中被广泛使用。Docker容器是Docker镜像的实例,封装了软件应用程序及其系统依赖项(即操作系统和相关软件包),构建了保证软件系统能够正常运行的环境。Docker镜像成为DevOps中软件系统构建和发布的主流制品形式,Docker容器则成为复杂分布式系统部署和运行的主流基本构成。Dockerfile是基于领域特定语言(domain specific language,DSL)编写的脚本代码,用于构建Docker镜像,并实例化Docker容器。Dockerfile包含一组构建Docker镜像的指令序列,声明了构建镜像时使用的操作系统、安装的软件包以及安装顺序等。
尽管Dockerfile被广泛用于构建Docker镜像,但人工编写Dockerfile十分复杂且容易出错,Dockerfile质量问题导致的Docker镜像构建失败案例普遍存在。一方面,Dockerfile指定了镜像构建的系统环境配置,特别是软件包之间的关联和依赖、软件包与操作系统的兼容性、软件下载安装的操作以及顺序等,需要全面的领域知识;另一方面,人工编写Dockerfile时的拼写错误、语法错误、违反最佳实践和Dockerfile坏味(bad smell)等质量问题难以避免。例如,在为Python代码片段构建Docker容器运行环境时,开发人员平均要花费2 h编写Dockerfile,但是仍难以保证Python代码片段正确运行。
2 相关工作
除了上述两项工作,还有其他工作关注与Docker相关的知识图谱构建和Dockerfile质量问题。DockerPedia是一个面向软件之间依赖关系以及安全漏洞信息的知识图谱,基于轻量级的本体论(ontology),建立了不同概念之间的联系。Binnacle工具集针对Dockerfiles构建AST,然后使用频繁子树挖掘算法来挖掘Dockerfile编写中的语义规则和最佳实践。Lu Z G等人总结了Dockerfile中的4种坏味模式,并提出了一种基于状态的静态分析方法来检测Dockerfile坏味。Wu Y W等人开展实证研究,总结了开源软件中的Dockerfile坏味。Hassan F等人通过分析软件环境的变化及其影响,向开发人员推荐Dockerfiles的更新。Cito J等人对Docker生态系统、Docker质量问题和Dockerfiles的演变进行了探索性的实证研究。
3 基于领域知识的Docker镜像自动构建方法
如图1所示,基于领域知识的Docker镜像自动构建方法主要分为两个阶段:知识图谱构建和Docker镜像自动生成,其中第二阶段的重点在于Dockerfile的自动生成。
图1 基于领域知识的Docker镜像自动生成构建流程
4 数据收集与知识图谱构建
数据收集与知识图谱的构建主要包括以下步骤:
步骤1 基于 络爬虫获取Docker Hub上的Docker项目及其对应的Dockerfile等数据;
步骤2 解析Dockerfile,并构建AST;
步骤3 从Dockerfile的AST中识别各种类型的实体以及实体间的关系;
步骤4 基于知识图谱元模型,整合解析得到的各类型实体和关系,生成知识图谱。
4.1 知识图谱元模型
领域知识图谱元模型M由实体集合En和关系集合Re构成,即M=(En,Re)。元模型结构如图2所示,主要包括8种类型的实体(Docker项目、Dockerfile、Docker镜像、操作系统、操作系统版本、软件包安装工具、软件包版本、软件);以及8种类型的关系(包含、构建、基于、实例化、使用、安装、兼容、关联),涵盖了Dockerfile自动生成所需的多种知识。元模型表达的语义知识包括:Docker项目包含Docker镜像和构建该镜像所使用的Dockerfile;Docker镜像可以依赖其他镜像,即将其他镜像作为构建时的基础镜像;Docker镜像中包含使用的操作系统信息,以及安装的软件包及其版本信息;软件包可以通过包管理软件安装,或者通过下载、配置、编译的方式安装;操作系统有不同的版本,不同操作系统安装软件包的方式不同,不同版本的操作系统可安装的软件包也不同;软件是软件包安装后的实例;软件包之间可能存在关联或依赖关系,这种关系决定了多个软件包在下载安装时需按照一定的先后顺序执行。
图2 领域知识图谱元模型
4.2 数据获取
● 针对缺少完整Docker项目列表的问题,爬虫实现了一个基于英文字母组合的检索关键词生成机制,使得检索结果能够覆盖所有的Docker项目;
● 以不同的关键词在Docker Hub上进行检索,获得以各个关键词开头的Docker项目列表;
● 针对海量数据的爬取效率问题,实现了基于多线程的并行爬取流程,通过多个线程的并行执行来提高Docker Hub上Docker项目的获取效率。
4.3 Dockerfile解析
Dockerfile解析包括两个阶段:Dockerfile预处理;构建Dockerfile对应的AST。
Dockerfile中的指令主要包括FROM指令、ENV指令和RUN指令等。其中, FROM指令用于指定基础镜像,ENV指令用于定义环境变量,RUN指令用于声明构建基础镜像时需要运行的bash命令行指令。例如,在图3的Dockerfile中,第1行FROM指令指出当前Docker镜像是基于centos镜像、centos7版本构建的;第3行ENV指令定义了两个环境变量LANG和LC_ALL,取值都为C.UTF-8;第6~8行RUN指令指出构建镜像时需要运行yum install指令,安装wget、bzip2、ca-certificates等软件包。
图3 示例Dockerfile(1)
Dockerfile预处理主要解析环境变量定义指令,并在随后出现的指令中将环境变量替换为对应的值,即通过预处理实现环境变量的实例化。解析环境变量包括以下两个步骤。
步骤1 解析环境变量定义指令。ENV指令的格式可以表示为“ENV key value”,其中,key表示环境变量的名称, value表示环境变量的值。因此,可以构建名-值映射表Map<key,value>来存储环境变量。对于每一条ENV语句,提取其中的key和value,并存入映射表中,实现对环境变量定义指令的解析。
步骤2 替换后续指令中出现的环境变量。在Dockerfile中使用环境变量时,环境变量以“$”开头。以此为依据提取每一条指令中出现的环境变量的名称,在映射表中查找对应的值,完成环境变量实例的替换。
图4是一份带有环境变量的Dockerfile,经过环境变量解析,共解析出ANDROID_NDK_VERSION、COCOS2D_X_VERSION、NDK_HOME 3个环境变量,并进一步对第5、8、9、10、11行环境变量的值进行替换,最终转换成为如图5所示的Dockerfile。
图4 示例Dockerfile(2)
图5 环境变量替换后的Dockerfile(2)
● 以Docker项目的名称为根节点,将每条指令解析为根节点的一个叶节点,用指令的名称表示;
● 关注指令后的文本。有些指令后的文本仍是Dockerfile指令的语法,如FROM、ENV等指令。对于这些指令,仍使用Dockerfile指令的语法解析器进行解析,生成相应的叶节点。有些语句指令后的文本嵌套的是bash指令的语法,如RUN、CMD等指令。对于这些指令,使用bash指令的语法解析器进行解析,生成相应的叶节点。
例如,图3的Dockerfile生成的AST如图6所示。其中,浅色节点是使用Dockerfile语法解析器解析生成的节点,深色节点是使用bash语法解析器解析生成的节点。
图6 Dockerfile(1)对应的AST
4.4 实体和关系识别
4.5 知识图谱构建
5 Dockerfile自动生成方法
5.1 基础镜像推荐
基础镜像推荐包括两步:在Gdf中找到候选基础镜像集合;候选基础镜像排序。
5.2 关联软件包分析
软件包间的关联具有传递性,故在Gdf中,从s对应的顶点开始,采用广度优先搜索(breadth first search,BFS)算法找到所有与s关联的包,生成Gdf的子图Gs。子图中所有顶点即需要安装的软件包集合PKGs。
● 当软件包pkgi和pkgj之间只存在一条边时,cor(pkgi, pkgj)的计算方法如式(1)所示。其中,w(i, j)表示知识图谱中边eij的权重,即所有Dockerfile中pkgi和pkgj共同被安装的次数。|pkgi|表示在所有Dockerfile中,pkgi被安装的次数。若软件包pkgi和pkgj之间只存在一条边,且关联度高于阈值,则说明pkgi和pkgj之间存在依赖关系,pkgi需要在pkgj之前安装。
● 当软件包pkgi和pkgj之间存在两条边时,cor(pkgi,pkgj)的计算方法如式(2)所示。其中,w(i, j)+w(j, i)表示在所有Dockerfile中pkgi和pkgj共同被安装的次数,|pkgi|+|pkgj|表示所有Dockerfile中pkgi被安装的次数和pkg j被安装的次数之和。软件包pkgi和pkgj之间存在两条边,且关联度高于阈值,只能说明两个包之间存在关联,两个软件包可以以任意顺序安装。
5.3 软件包安装顺序推断
5.4 Dockerfile生成
根据基础镜像、需要安装的软件包及安装顺序,本方法生成Dockerfile的步骤如下。
● 根据基础镜像imgbase,生成指令FROMimgbase。
● 根据软件包的安装顺序,逐条生成各个软件包的安装指令。
● 对于OPS,在知识图谱中找到该软件包对应的包管理器,生成运行包管理器安装该软件包的RUN指令。例如,若软件包pkg的包管理器是apt-get,则会生成指令RUN apt-get install -y pkg[=version],以安装该软件包。
6 实验与分析
6.1 实验方法
● 构建成功率(build success rate, BSR):表示Dockerfile成功构建镜像的比率,计算方法如式(3)所示,其中|DFtotal|表示生成Dockerfile的总数,|DFbs|表示基于生成的Dockerfile能够成功构建镜像的数量。
● 配置成功率(configuration success rate,CSR):表示Dockerfile成功构建镜像,并使得给定软件能够正确运行的比率,计算方法如式(4)所示,其中|DFcs|表示成功运行的镜像的数量。
6.2 实验结果与分析
● 最常被安装的软件包是cURL,其次是wget、tar、Git和GNU Make等,分布如图7所示。这些软件包主要用于下载、解压和编译UOPS。
● Ubuntu操作系统镜像最常被作为基础镜像,被作为基础镜像的比率达到47%。
● 基础镜像获取失败:Docker Hub上存储的基础镜像丢失或无法访问,无法拉取基础镜像构建新的镜像。5份Dockerfile构建失败的原因是基础镜像获取失败。
● 依赖缺失:没能在知识图谱中建立软件包完整的依赖关系,导致软件包无法成功安装。6份Dockerfile构建失败的原因是依赖关系缺失。
● 文件路径错误:构建Docker镜像时,访问了已经不存在的文件路径。6份Dockerfile构建失败的原因是文件路径错误。
● 其他错误:包括字符集编码错误、授权无效等。10份Dockerfile构建失败的原因是其他错误。
笔者认为,可以从以下方面进一步改进,减少构建失败和配置失败。
● 完善知识图谱:继续从Docker Hub和GitHub等开源 区收集Docker项目,解析Dockerfile,并提取软件包之间的关联,进一步提高知识图谱的完整性。
图7 常用软件包统计
● 资源有效性检测:在使用资源(包括基础镜像和软件包等)前预先访问,以确保资源的有效和可访问。
● UOPS配置模式总结:UOPS的安装配置主要包括下载、解压、编译和建立链接等步骤,因此可以进一步总结UOPS的配置模式,用于完善软件安装所必需的相关指令。
7 结束语
陈伟(1980-),男,博士,中国科学院软件研究所副研究员,中国计算机学会会员,主要研究方向为软件工程、 络分布式计算等。
叶宏杰(1996-),男,中国科学院软件研究所硕士生,主要研究方向为软件工程。
周家宏(1995-),男,中国科学院软件研究所硕士生,主要研究方向为机器学习、知识图谱等。
魏峻(1970-),男,博士,中国科学院软件研究所研究员、博士生导师,主要研究方向为软件工程、 络分布式计算等。
联系我们:
大数据期刊
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!