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

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

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

其他几个项目从源代码和/或需求文件创建Docker映像,包括: alibaba / derrick , jupyter / repo2docker , Gueils / whales , o2r-project / containerit ; openshift /图片来源和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

Dockter:研究人员的容器图像生成器相关推荐

  1. GAN和PS合体会怎样?东京大学图像增强新研究:无需配对图像,增强效果还可解释...

    十三 发自 凹非寺  量子位 报道 | 公众号 QbitAI GAN和PS合体,会擦出怎样的火花? 在让图像变美的这条道路上,方法可谓是层出不穷. 过去,若是有大量的原始图像和增强图像,那么我们就可以 ...

  2. 计算机视觉研究人员必备的Linux命令行技巧

    介绍 Jeroen Janssens在<命令行的数据科学>一书中对命令行优势进行了很好的分类: 命令行是灵活的:这个特性使它非常适合数据科学的探索性质.因为你想要及时得到结果. 命令行可以 ...

  3. 从文本创建艺术,AI图像生成器的数据集是如何构建的

    AIGC系列分享是整数智能推出的一个全新分享系列,在这个系列中,我们将介绍与AIGC概念相关的有趣内容.AIGC系列主要分为以下几篇文章: 被称为下一代风口的AIGC到底是什么? AIGC的数据集构建 ...

  4. 机器学习研究人员需要学习8种神经网络架构

    翻译 | AI科技大本营(rgznai100) 参与 | 林椿眄 编辑 | Donna 为什么我们需要机器学习? 机器学习可以解决人类不能直接用编程来应对的复杂难题,因此,我们喂给机器学习算法大量的数 ...

  5. AI技术如何帮助研究人员重现历史的气味?

    欧盟已经向这支计划使用AI技术重现历史气息与嗅觉要素的研究团队提供280万欧元资助. 团队名为"Odeuropa",拥有来自多个学科的欧洲科学家及学者,具体涵盖历史.艺术史.计算语 ...

  6. 神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据

    本文讲的是神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据,近日,一组以色列研究人员设计了一种新技术,可以利用扫描仪通过受控恶意软件在气隙系统(air-gapped)中获取用户设备中的数据. 关 ...

  7. Nature子刊 | 研究人员提出神经脆性可作为癫痫发作区(SOZ)的脑电图(EEG)标志物

    约翰·霍普金斯大学Adam Li研究组发现神经脆性可作为癫痫发作区 (SOZ)的脑电图 (EEG)标志物.他们通过使用注释 SOZ 的神经脆弱性作为预测手术预后的指标,在对 91 名患者的回顾性分析中 ...

  8. ​厦大等高校研究人员利用卷积神经网络学习脑电地形图表示进行分类

    脑电图(EEG)地形图表征(Electroencephalography topographical  representation, ETR)可以监测区域大脑活动,是一种可以用于探索皮层机制和联系的 ...

  9. 研究人员利用脑机接口可以直接预测我们的偏好

    来自哥本哈根大学(University of Copenhagen)和赫尔辛基大学(University of  Helsinki)的一个研究团队发现,可以根据一个人的大脑反应与其他人的匹配程度来预测 ...

最新文章

  1. 【Windows】如何判断当前鼠标是否按下左键或右键
  2. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )
  3. oracle基本的查询语句,oracle 基本查询语句及实例
  4. 当深度学习遇上量化交易——因子挖掘篇
  5. RAID简介与示例演示
  6. ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法
  7. flask基础之jinja2模板-语法定义
  8. 122 - Trees on the level(模拟内存池解法)
  9. 中小企业用户如何选择简单进销存软件?
  10. 普林斯顿大学计算机科学研究生条件,普林斯顿大学之计算机科学系
  11. 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning
  12. 审查元素找不到创建的元素_面试被问:Selenium元素定位不到问题,如何回答?...
  13. 从yesno模型入门kaldi语音识别
  14. php加入语音播报功能_微信收付款怎么设置语音播报
  15. 用Tkinter打造GUI开发工具(35)Tkinter中的视频播放组件
  16. Eclipse中安装反编译工具Fernflower(Enhanced Class Decompiler)
  17. 解决VMware装上Mac后icloud无法激活 【安装QQ发现不能注册Apple ID】
  18. luci网页shell_修改Luci界面
  19. treble_Android上的Project Treble是什么,我的手机会收到吗?
  20. 用Jplayer做的一个带动画的播放器

热门文章

  1. Nginx应用场景之HTTP服务器
  2. 关于Redis Cluster的几个问题
  3. 分布式理论-BASE理论
  4. Eclipse Memory Analyzer(MAT) 使用总结
  5. activity动态加签任意节点
  6. GitLab 发布安全修复版本:11.9.4, 11.8.6 和 11.7.10
  7. 88.搭建git服务器 安装与使用gitlab gitlab备份与恢复
  8. Linux 下rpm包搭建LAMP环境
  9. 《SSM框架实战》 整合 Freemarker
  10. KVC的底层实现原理