嵌套容器 —— 在 Podman 容器内构建并运行 Buildah
去年圣诞节,笔者送给妻子一套俄罗斯套娃。它们由一个木偶组成,每个木偶打开后是另外一个更小的木偶,直到最小那个出现。这个概念让我想到了嵌套容器。
我想我或许可以尝试用 Podman 来构建自己的嵌套容器,我可以在容器中基于 Buildah 做开发,也可以继续创建 Buildah 容器和映像。一旦创建了 Podman 容器,就可以将它移到任意支持 Podman 的 Linux 系统上。然后使用 Buildah 进行开发。本文中我将详细介绍整个过程。
环境准备
本文是在一个全新安装的 Fedora 29 虚拟机上进行的,系统上安装了最新版本的 Podman 和 container-selinux ,安装命令为:dnf -y install podman container-selinux --enablerepo updates-testing
。相应版本是 Podman v1.1.2 和 container-selinux 2.85-1.
不管是容器,还是容器中的容器都要用到 fuse-overlayfs,当尝试将其相应目录安装在一起时会有很多麻烦。因此,第一步应该为容器创建一个目录,这里我们将其命名为 /var/lib/mycontainer
:
# mkdir /var/lib/mycontainer
创建 Podman 容器
接下来我创建了如下的 Dockerfile ,主要操作包括拉取 Fedora、设置 GOPATH、安装 Buildah 依赖,使用 git 克隆 buildah 项目到 /root/buildah
目,最后更新 /etc/container/storage.conf
文件,主要是去掉 mount_program 的注释:
# FILE=~/Dockerfile.cinc # /bin/cat <<EOM >$FILE FROM fedora:latest ENV GOPATH=/root/buildah RUN dnf -y install \ make \ golang \ bats \ btrfs-progs-devel \ device-mapper-devel \ glib2-devel \ gpgme-devel \ libassuan-devel \ libseccomp-devel \ ostree-devel \ git \ bzip2 \ go-md2man \ runc \ fuse-overlayfs \ fuse3 \ containers-common; \ mkdir /root/buildah; \ git clone https://github.com/containers/buildah /root/buildah/src/github.com/containers/buildah RUN sed -i -e 's|#mount_program = "/usr/bin/fuse-overlayfs"|mount_program = "/usr/bin/fuse-overlayfs"|' /etc/containers/storage.conf EOM
接下来我们使用该 Dockerfile 创建一个镜像( 请注意行末不容易发现的句号),该命令执行完需要 5 到 10 分钟之久,而且即将结束时看起来像假死一样,请耐心等待,你可以趁着这个时间去喝杯茶。
# podman build -t buildahimage -f ~/Dockerfile.cinc .
接下来是一个很重的过程,我们创建了一个 Podman 容器用来做 Buildah 开发。下面命令创建一个名为 buildahctr
的容器,并将宿主 mycontainer
安装到容器的 containers
目录,该容器会与宿主主机网络隔离,关闭标签和 seccomp 限制,最后执行一些脚本让容器启动并运行。
# podman run --detach --name=buildahctr --net=host --security-opt label=disable --security-opt seccomp=unconfined --device /dev/fuse:rw -v /var/lib/mycontainer:/var/lib/containers:Z buildahimage sh -c 'while true ;do wait; done'
Buildah 开发
棒极了,现在我们已经有一个运行了 Fedora 的容器,接下来我们可以在容器内开始编译和安装 Buildah 。命令如下:
# podman exec -it buildahctr /bin/sh
现在我们已经在容器内了,接下来是标准的 make、git 和运行 buildah。(请注意接下来的 5 个命令我们是在提示符 sh-4.4#
下运行的,为了简化复制粘贴我已经删了很多提示信息)
sh-4.4# cd /root/buildah export GOPATH=`pwd` cd /root/buildah/src/github.com/containers/buildah make make install sh-4.4# buildah from alpine alpine-working-container sh-4.4# buildah images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/alpine latest 5cb3aa00f899 9 days ago 5.79 MB
到此为止我们已经在 Podman 容器中编译、安装和运行 Buildah 了。
接下来我们将快速的调整 Buildah 源码并看看这些变化是否生效。请用 vi 或者你喜欢的编辑器修改 cmd/buildah/images.go
. 搜索 outputHeader()
函数 (大约 219 行) ,你将找到这么一行代码 format := "table {{.Name}}\t{{.Tag}}\t"
. 删除单词 “table” ,改成 format := "{{.Name}}\t{{.Tag}}\t”
. 保存文件并退出,然后再次执行 make
和 make install
。
sh-4.4# vi cmd/buildah/images.go sh-4.4# make sh-4.4# make install
现在再次运行 buildah images
, 你将看到所有的输出行为跟打开 --quiet
参数的效果一样,而且不显示表头:
sh-4.4# buildah images docker.io/library/alpine latest 5cb3aa00f899 9 days ago 5.79 MB
在 Podman 容器中运行 buildah 容器
接下来是最有趣的事情。我们将来看看是否可以在 Podman 容器中运行 Buildah 容器。接下来我们需要做一些简单工作来列出 / 目录内容。
sh-4.4# buildah from --name myalpine alpine myalpine sh-4.4# buildah run --isolation=chroot myalpine ls / bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
便携的 Buildah 开发环境
如果你已顺利完成上述步骤,你就可以在 Podman 容器中做 Buildah 开发了。这个容器同时还可以构建并运行其他容器。这里我使用的是 Buildah,但其实也可以使用 Podman 来构建内部容器。无论选择何种内部工具,现在我们都拥有了一个包含其他容器的容器,就好像前面我们提到的套娃。而且我也可以将这个容器提交到 Quay.io 和其他容器注册网站,并从这些网站拉取容器镜像运行到另外的 Fedora 机器或者其他 Linux 平台上。这样我们也就获得了一个便携的 Buildah 开发环境。
希望这篇文章可以让你学习到如何使用 Podman 和 Buildah 创建一个更灵活的开发环境。
P.S. 在此过程中不需要运行任何守护进程,没有对系统做任何破坏。
本文翻译自:https://developers.redhat.com/blog/2019/04/04/build-and-run-buildah-inside-a-podman-container/
![](/img/my/wx.png)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
gitbook 入门教程之实用插件(新增3个插件)
插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论插件 search-plus 中文搜索插件 gitalk 评论插件并不是 gitbook 插件,因而集成方式和一般的插件安装方式不同! tbfed-pagefooter 版权页脚插件 如果希望将网页源码暴露出去并接受公众的监督校准的话,使用edit-link插件可以直接链接到源码文件. 链接地址: https://plugins.gitbook.com/plugin/tbfed-pagefooter 激活插件配置 在 book.json 中配置 tbfed-pagefooter 插件,详细说明请参考 tbfed-pagefooter 插件. 示例: { "plugins": ["tbfed-pagefooter"], "pluginsConfig": { "tbfed-pagefooter": { "copyright":"© snowdreams1006", "modif...
- 下一篇
并发delete+insert duplicate-key冲突导致死锁
死锁案例 简化后的死锁场景如下 环境: mysql5.7,事务隔离级别REPEATABLE-READ 表结构 CREATE TABLE `t4` ( `a` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`a`) ) ENGINE=InnoDB 数据: mysql> select * from t4; +---+ | a | +---+ | 1 | +---+ 并发事务 T1 T2 begin; begin delete from t4 where a = 1;//ok, 0 rows affected delete from t4 where a = 1; //wating,被阻塞 insert into t4 values(1);//Query OK, 1 row affected (0.01 sec) ERROR 1213 (40001): Deadlock found when trying to get lock; 从上面可以看出,并发事务执行delete,T2等待,T1再执行insert相同value的数据时出现死锁。 死...
相关文章
文章评论
共有0条评论来说两句吧...