姓名学中萍字无根 怎么解释_无根Buildah的工作原理:在非特权环境中构建容器
姓名学中萍字无根 怎么解释
在以前的文章中,包括无根Podman如何工作? ,我谈到了Podman ,该工具使用户可以管理Pod,容器和容器图像。
Buildah是用于构建与Podman互补的Open Container Initiative( OCI )容器映像的工具和库。 (这两个项目都是由我所属的容器组织维护的。)在本文中,我将讨论无根Buildah,包括它与Podman之间的区别。
Buildah的目标是构建一个低级工具,可以直接使用它,也可以将其提供给其他工具来构建容器映像。
为什么选择Buildah?
这是我描述容器映像的方式:基本上是一个rootfs目录,其中包含运行容器所需的代码。 该目录称为rootfs,因为在Linux机器上它通常看起来像/(root) ,这意味着您很可能在rootfs中找到目录,例如/ etc , / usr , / bin等。
OCI图像格式规范 。
然后将rootfs和JSON文件压缩在一起,以创建存储在容器注册表中的映像包。 要创建分层图像,请在rootfs中安装更多软件,然后修改JSON文件。 然后,将新的和旧的rootfs的差异打包,并将其存储在另一个映像tarball中。 第二个JSON文件通过校验和引用回第一个JSON文件。
许多年前,Docker引入了Dockerfile,这是一种用于构建容器映像的简化脚本语言。 Dockerfile很棒,而且确实起飞了,但是它有许多用户抱怨的缺点。 例如:
Dockerfile鼓励在容器映像中包含用于构建容器的工具。 容器映像不需要包含yum / dnf / apt,但是大多数包含其中之一及其所有依赖项。
每行导致创建一个图层。 因此,机密可能会错误地添加到容器映像中。 如果您在Dockerfile的一行中创建一个密钥,然后在下一行将其删除,则该密钥仍在映像中。
我对“容器革命”的最大抱怨之一是,自它诞生以来已有六年,构建容器映像的唯一方法仍然是使用Dockerfiles。 除了Buildah之外,还出现了除docker build之外的许多工具,但大多数工具仍仅处理Dockerfile。 因此,用户继续绕过Dockerfile的问题。
需要注意的是umoci是码头工人建立一个替代方案,可以让你建集装箱图像,无需Dockerfile。
Buildah的目标是构建一个简单的工具,该工具可以在磁盘上创建rootfs目录,并允许其他工具填充该目录,然后创建JSON文件。 最后,Buildah将创建OCI映像并将其推送到容器注册表,该容器注册表可被任何容器引擎(例如Docker ,Podman, CRI-O或其他Buildah)使用。
Buildah还支持Dockerfile,因为我们知道构建容器的大多数人都创建了Dockerfile。
直接使用Buildah
许多人直接使用Buildah。 Buildah的一个很酷的功能是您可以直接在Bash中编写容器构建脚本。
下面的示例创建一个bash脚本叫myapp.sh,它使用Buildah拉下Fedora的图像,然后使用DNF, 使一台机器上的软件安装到容器图像根文件系统,$ MNT。 然后,它使用buildah config将一些字段添加到JSON文件,并将容器提交到容器映像myapp 。 最后,它将容器映像推送到容器注册表quay.io。 (它可以将其推送到任何容器注册表。)现在,任何容器引擎或Kubernetes都可以使用此OCI映像。
cat myapp.sh
#!/bin/sh
ctr=$(buildah from fedora)
mnt=($buildah mount $ctr)
dnf -y install --installroot $mnt httpd
make install DESTDIR=$mnt myapp
rm -rf $mnt/var/cache $mnt/var/log/*
buildah config --command /usr/bin/myapp -env foo=bar --working-dir=/root $ctr
buildah commit $ctr myapp
buildah push myapp http://quay.io/username/myapp
要创建非常小的图像,您可以在上面的脚本中用草稿替换fedora ,并且Buildah将构建一个容器图像,该图像仅对容器图像中的httpd包具有要求。 无需Python或DNF。
Podman与Buildah的关系
使用Buildah,我们有一个用于构建容器映像的低级工具。 Buildah还为其他工具提供了一个用于构建容器映像的库。 Podman旨在取代Docker命令行界面(CLI)。 Docker CLI之一是docker build 。 我们需要构建podman以支持使用Dockerfiles构建容器映像。 Podman在Buildah库中提供,以允许它执行podman构建 。 每当执行podman构建时 ,您都在执行Buildah代码来构建容器映像。 如果仅打算使用Dockerfiles来构建容器映像,我们建议您仅使用Podman。 根本不需要Buildah。
使用Buildah库的其他工具
Podman不是利用Buildah库的唯一工具。 OpenShift 4 Source-to-Image (S2I)也将使用Buildah构建容器图像。 OpenShift S2I允许使用OpenShift的开发人员使用Git命令修改源代码; 当他们将对源代码的更改推送到Git存储库时,OpenShift会启动一项工作,以编译源更改并创建容器映像。 它还在幕后使用Buildah构建该映像。
Ansible-Bender是一个通过Ansible剧本构建容器图像的新项目。 对于熟悉Ansible的人来说,Ansible-Bender可以轻松描述容器映像的内容,然后使用Buildah打包容器映像并将其发送到容器注册表。
我们希望看到其他用于描述和构建容器映像的工具和语言,并欢迎其他人使用Buildah进行转换。
无根问题
Buildah在无根模式下可以正常工作。 它使用用户命名空间的方式与Podman相同。 如果执行
$ buildah bud --tag myapp -f Dockerfile .
$ buildah push myapp http://quay.io/username/myapp
在您的主目录中,一切正常。
但是,如果执行上述脚本,它将失败!
问题在于,当在无根模式下运行buildah mount命令时, buildah命令必须将其自身放入用户名称空间中并创建新的安装名称空间。 如果非root用户不在用户名称空间中运行,则不允许其挂载文件系统。
当Buildah可执行文件退出时,用户名称空间和安装名称空间消失,因此安装点不再存在。 这意味着在buildah挂载后尝试写入$ mnt的命令将失败,因为不再挂载$ mnt 。
我们如何使脚本在无根模式下工作?
Buildah取消分享
Buildah有一个特殊的命令buildah unshare ,它允许您输入用户名称空间。 如果不执行任何命令,它将在用户名称空间中启动一个外壳程序,您的外壳程序似乎以root身份运行,而主目录的所有内容似乎都由root拥有。 如果查看/ usr中的所有者或文件,它将列出它们为nfsnobody (或没人)拥有。 这是因为您的用户ID(UID)现在位于用户名称空间内部,而真实根(UID = 0)并未映射到用户名称空间。 内核将未映射到用户名称空间的UID拥有的所有文件表示为NFSNOBODY用户。 退出外壳程序时,将退出用户名称空间,回到正常的UID,主目录将再次归您的UID所有。
如果要执行上面定义的myapp.sh命令,可以执行buildah unshare myapp.sh ,脚本现在将正确运行。
结论
现在可以在非特权环境中构建和运行容器,并且非常有用。 开发人员没有理由将容器开发为根。
如果您想使用传统的容器引擎,并使用Dockerfile进行构建,那么您可能应该只使用Podman。 但是,如果您想尝试以新方式构建容器映像而不使用Dockerfile,那么您应该真正了解Buildah。
翻译自: https://opensource.com/article/19/3/tips-tricks-rootless-buildah
姓名学中萍字无根 怎么解释
姓名学中萍字无根 怎么解释_无根Buildah的工作原理:在非特权环境中构建容器相关推荐
- linux 扩展zhu分区,Linux分区调整(LVM和非LVM环境中扩容和缩小)
前言:我的上一篇博文详细介绍了磁盘.格式以及分区知识,里面也涉及了LVM,本文主要实践下LVM和非LVM环境中Linux分区如何扩容和缩小. 分区调整原理: Linux磁盘分区和磁盘格式紧密相连,想要 ...
- 光电编码器的原理及应用场合_旋转式光电编码器工作原理及在视觉检测中的使用...
一.光电编码器工作原理 光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器.这是目前应用最多的传感器,光电编码器是由光栅盘和光电检测装置组成.光栅盘是在一定直径的圆板上 ...
- 蚂蚁区块链第9课 SSL/TLS工作原理及在蚂蚁BAAS中的应用
1,摘要 辉哥在学习蚂蚁BAAS系统时,发现了一堆证书或者公私钥名称,包括trustCa,ca.crt,client.crt,client.key,pub.txt,MyPKCS12.p12等等文件,不 ...
- QQ浏览器该站点长时间无响应_图解浏览器的基本工作原理
前言 可能每一个前端工程师都想要理解浏览器的工作原理. 我们希望知道从在浏览器地址栏中输入 url 到页面展现的短短几秒内浏览器究竟做了什么: 我们希望了解平时常常听说的各种代码优化方案是究竟为什么能 ...
- 用555定时器接成的施密特触发器电路/滞回电压比较器中,用什么方法能调节回差电压的大小?包含工作原理与应用
一.简答: 电源电压或外接控制电压改变时,可以改变回差电压的大小. 二.施密特触发器电路工作原理: 滞回电压比较器,又名施密特触发器,有两个稳定状态,与一般触发器不同的是,施密特触发器采用电位触发方式 ...
- arduino编码器计数_旋转编码器的工作原理以及如何在Arduino中使用
在本篇文章中,我们将学习旋转编码器的工作原理以及如何将其与Arduino开发板一起使用.旋转编码器是一种位置传感器,用于确定旋转轴的角度位置.它根据旋转运动产生模拟或数字电信号. Rotary-Enc ...
- plsql developer无监听程序_无停机优雅重启 Go 程序
什么是优雅重启 在不停机的情况下,就地部署一个应用程序的新版本或者修改其配置的能力已经成为现代软件系统的标配.这篇文章讨论优雅重启一个应用的不同方法,并且提供一个功能独立的案例来深挖实现细节.如果你不 ...
- multism中ui和uo应该怎么表示_吐血整理!这篇带你彻底理解主存中存储单元地址的分配...
在阅读本文之前,建议没有基础的读者先阅读下主存的基本组成结构: 五分钟理解主存储器的基本组成结构 存储单元的字地址: 我们来看张图: 在上面的图中,每一个小矩形代表一个存储单元,大矩形表示主存中的存储 ...
- crtsiii型无砟轨道板_无砟轨道裂缝破损怎么修补
随着高速铁路.客运专线.城市地铁的快速发展,无砟轨道轨道板(道床板)广泛应用,但施工中和运营期都发现轨道板混凝土存在不同程度的微细裂缝,对无砟轨道造成了一定的病害.高铁轨道板裂缝是不可避免的.为确保无 ...
最新文章
- Xeno Tactic 2
- 线性表(二)——链表
- 企业校园网的6大趋势
- 4号团队-团队任务5:项目总结会
- 程序猿的奋斗史(三十八)——大学断代史(二)——我与数据库的故事
- C# --CSkin的使用教程
- iPhone上塔罗牌测试软件,塔罗牌占卜:测Ta对你是用情至深还是一时兴起?准到没朋友!...
- python中平方_python里平方
- java for步长_Velocity模板循环支持自定义步长
- 修改mtk平台power按键的gpio控制口
- 读河南干旱帖有感而发的一天(20191006)
- 某内容管理系统最最最详细的代码审计
- github上实用、常用的插件和库
- 羊毛出在狗身上,猪来买单
- 【JavaScript 逆向】AST 技术反混淆
- CAD软件中文本如何屏蔽
- 浙江大学电子信息计算机,浙江大学城市学院计算机与计算科学学院 党政办 计算学院新增12名浙江大学电子信息专业硕士研究生导师...
- Office 2010安装错误 1042 无法打开注册表项
- Python脚本批量重命名图片
- 如何恢复断电造成的丢失文件
热门文章
- 用ado把excel数据写入oracle,如何将excel表格数据导入到oracle数据库对应的表中?!oracle导出excel文件...
- Android PAI (PlayAutoInstall)功能一些经验
- el-table fixed 设置固定列头部背景不透明
- 《天龙八部》地形研究-1
- 使用软碟通(UltraISO)刻录Linux系统
- java奈奈老师2_【图片】奥尔三X作【新任女教师奈奈、同居俏佳人、同居俏女仆】攻略&结局【javagame吧】_百度贴吧...
- 天龙八部玄武岛BOSS
- 联通彻底被iPhone抛弃,失去绯闻女友
- qmake prl TEMPLATE=subdir之错误小记
- c语言法定节日日历程序,C 语言写的日历