文档章节

嵌套容器 —— 在 Podman 容器内构建并运行 Buildah

红薯
 红薯
发布于 04/07 08:28
字数 1429
阅读 1244
收藏 9

去年圣诞节,笔者送给妻子一套俄罗斯套娃。它们由一个木偶组成,每个木偶打开后是另外一个更小的木偶,直到最小那个出现。这个概念让我想到了嵌套容器。

我想我或许可以尝试用 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/

© 著作权归作者所有

红薯

红薯

粉丝 21756
博文 146
码字总数 64283
作品 8
深圳
产品经理
私信 提问
加载中

评论(1)

O龙猫O
O龙猫O
比我多了一个O😂
使用 Podman 以非 root 用户身份运行 Linux 容器

Linux 容器是由 Linux 内核所提供的具有特定隔离功能的进程 —— 包括文件系统、进程和网络的隔离。容器有助于实现可移植性 —— 应用可以在容器镜像中与其依赖项一起分发,并可在几乎任何有...

作者: Adam Šamalík
2018/10/26
0
0
Podman 和用户名字空间:天作之合

了解如何使用 Podman 在单独的用户空间运行容器。 Podman 是 libpod 库的一部分,使用户能够管理 pod、容器和容器镜像。在我的上一篇文章中,我写过将 Podman 作为一种更安全的运行容器的方式...

作者: Daniel J Walsh
08/25
0
0
RHEL 7.6 Beta 的 Podman 介绍

Red Hat Enterprise Linux(RHEL)7.6 Beta版是几天前发布的,我注意到的第一个新特性是Podman。Podman通过提供与Docker命令行类似的体验来补充Buildah和Skopeo:允许用户运行独立的(非编排...

oschina
2018/08/31
2.3K
0
Red Hat Enterprise Linux 7.6 beta 发布

Red Hat Enterprise Linux 7.6 beta 发布了。Red Hat Enterprise Linux 7 的最新更新旨在为要求苛刻的业务环境提供控制、信心和自由,与云原生创新保持同步,同时支持跨企业 IT 的许多足迹的...

h4cd
2018/08/23
3.5K
11
Red Hat Enterprise Linux 7.7 正式发布

Red Hat Enterprise Linux 7.7 现在正式发布了。Red Hat Enterprise Linux 7.7 为 IT 运营团队提供了跨云基础设施的增强一致性和控制,同时还为企业应用程序开发人员提供了一套现代的、受支持...

afterer
08/07
2.9K
8

没有更多内容

加载失败,请刷新页面

加载更多

什么是线程死锁,如何解决

产生死锁的条件有四个: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得资源,在末使用完...

苏坡吴
43分钟前
5
0
CSS

一、CSS概述 1、什么是CSS Cascading style sheets,层叠样式表、级联样式表,简称样式表 2、css的作用 设置HTML网页中元素的样式 3、HTML与CSS的关系 HTML:负责网页的搭建,内容展示--网页...

wytao1995
54分钟前
6
0
二叉查找树的第 K 个结点

private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret;}private void inOrder(TreeNode root......

Garphy
今天
4
0
windo8 weblogic

需要的软件包 现在安装jdk 则先进入你电脑自带jdk \bin目录下 然后java -jar 执行你的jar包就可以了 欢迎界面直接点击下一步,跳到更新界面,直接选择跳过 然后选择安装目录(注意:目录不要有...

恩多
今天
8
0
Activiti 批注

Activiti添加批注(comment)信息 在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等  1、添加批注 // 由于流程...

奔跑的android
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部