依赖地狱在研究软件领域无处不在,这影响了研究的透明度和可重复性。 容器化是解决此问题的一种方法,但它给研究人员带来了新的挑战。 Docker在研究界越来越流行,但是要有效地使用它,需要扎实的Dockerfile编写技能。

作为Stencila项目的一部分,该项目是一个用于创建,协作和共享数据驱动的内容的平台,我们正在开发Dockter ,这是一种开源工具,可使研究人员更轻松地为其项目创建Docker映像。 Dockter扫描研究项目的源代码,生成Dockerfile,并构建Docker映像。 它具有一系列功能,可以提供灵活性,并可以帮助研究人员学习更多有关使用Docker的知识。

Dockter还会生成一个JSON文件,其中包含有关软件环境的信息(基于CodeMetaSchema.org ),以实现进一步的处理以及与其他工具的互操作性。

其他几个项目从源代码和/或需求文件创建Docker映像,包括: alibaba / derrickjupyter / repo2dockerGueils / whaleso2r-project / containeritopenshift /图片来源ViDA-NYU / reprozip 。 Dockter与repo2docker,containerit和ReproZip相似,它的目标读者是进行数据分析的研究人员(并支持R),而其他大多数工具则针对软件开发人员(不支持R)。

Dockter与这些项目的主要区别在于:

  • 对多种语言执行静态代码分析,以确定包装要求
  • 使用程序包数据库确定程序包系统依赖性并生成链接的元数据(Containerit为R执行此操作)
  • 更快地安装语言包依赖项(这在依赖项经常更改的研究项目中很有用)
  • 默认情况下(但可选)安装Stencila软件包,以便Stencila客户端接口可以执行容器中的代码

Dockter的功能

以下是研究人员使用Dockter的一些方法。

从代码生成Docker映像

Dockter扫描研究项目文件夹并为其构建Docker映像。 如果文件夹中已经有一个Dockerfile,Dockter将从中构建映像。 否则,Dockter将扫描该文件夹中的源代码文件并生成一个。 Dockter当前处理R,Python和Node.js源代码。 它生成的.dockerfile(以点开头)可以完全编辑,因此用户可以接管Dockter并继续编辑他们认为合适的文件。

如果该文件夹包含R包DESCRIPTION文件,则Dockter将安装“导入到映像”下列出的R包。 如果该文件夹不包含DESCRIPTION文件,则Dockter将扫描该文件夹中的所有R文件以获取包导入或使用说明,并创建一个.DESCRIPTION文件。

如果该文件夹包含Python的requirements.txt文件,则Dockter会将其复制到Docker映像中,并使用pip安装指定的软件包。 如果该文件夹不包含这些文件中的任何一个,则Dockter将扫描该文件夹的所有.py文件中的导入语句,并创建一个.requirements.txt文件。

如果该文件夹包含package.json文件,则Dockter会将其复制到Docker映像中,并使用npm安装指定的软件包。 如果该文件夹不包含package.json文件,则Dockter将扫描该文件夹的所有.js文件以查找require调用,并创建一个.package.json文件。

自动捕获系统需求

研究人员在手写Dockerfile时面临的头痛之一是弄清楚他们的项目需要哪些系统依赖项。 通常,这涉及很多试验和错误。 Dockter自动检查是否有任何依赖项(或依赖项的依赖关系,或…的依赖项)是否需要系统软件包并将其安装到映像中。 不再需要构建,失败,添加依赖项,重复……的反复试验和错误循环。

更快地重新安装语言包

如果您曾经构建过Docker映像,则知道添加或删除一个映像时,等待所有项目依赖项重新安装可能会令人沮丧。

发生这种情况的原因是Docker的分层文件系统:更新需求文件时,Docker会丢弃所有后续层,包括先前安装依赖项的层。 这意味着必须重新安装所有软件包。

Dockter采用了不同的方法。 它将语言包的安装留给语言包管理器:Python的pip,Node.js的npm和R的install.packages。 这些程序包管理器擅长于其设计的工作:检查哪些程序包需要更新,并且仅更新它们。 结果是重建速度大大加快,尤其是对于R包,它通常涉及编译。

Dockter通过在Dockerfile中寻找特殊的#ockter注释来做到这一点。 它不会丢弃层,而是在同一层中的此注释之后执行所有指令,从而重用以前安装的软件包。

生成项目的结构化元数据

Dockter使用JSON-LD作为其内部数据结构。 解析项目的源代码时,它将使用schema.org和CodeMeta中的词汇表生成JSON-LD树。

Dockter还获取有关项目依赖项的元数据,该元数据可用于生成项目的完整软件引用。

容易拿起,容易丢弃

Dockter旨在使您更轻松地开始为您的项目创建Docker映像。 但它的设计也不会妨碍您或限制您使用裸露的Docker。 您可以轻松地并单独地覆盖Dockter用来构建映像的任何步骤。

  • 代码分析:要停止Dockter进行代码分析并指定项目的程序包依赖关系,只需删除开头的 .DESCRIPTION,.requirements.txt或.package.json文件中的(点)。
  • Dockerfile生成: Dockter旨在生成符合最佳实践的可读Dockerfile。 它们包括对每个部分的作用的注释,是开始学习如何编写自己的Dockerfile的好方法。 要阻止Dockter生成.Dockerfile并开始自己进行编辑,只需将其重命名为Dockerfile(不带前导点)。

安装底座

Dockter可作为预编译的独立命令行工具或Node.js包提供。 单击此处进行演示。

我们欢迎并鼓励所有贡献

该项目的GitHub页面上提供了本文的较长版本。


Aleksandra Pawlik将在1月21日至25日于新西兰基督城的linux.conf.au上介绍如何构建可复制的计算环境:非专家研讨会

翻译自: https://opensource.com/article/19/1/dockter-image-builder-researchers