最近在研究用 Podman 当作极狐GitLab 的 Runner,来跑 CI/CD,根据 Podman 官网安装指南,在 Ubuntu 上安装使用如下命令即可:
# Ubuntu 20.10 and newer
sudo apt-get update
sudo apt-get -y install podman
安装完毕,查看了一下版本
podman version
Version: 3.4.4
API Version: 3.4.4
Go Version: go1.18.1
Built: Thu Jan 1 08:00:00 1970
OS/Arch: linux/amd64
版本是 3.4.4
。但是在创建 Runner 的过程中,发现极狐GitLab 官方要求,在使用 Podman 的时候,版本必须高于 4.2
。然后想用 apt
的方式来升级一下,未果。然后看到了 Podman GitHub 上的一个 Discussion——How to install podman 4.4 on Ubuntu 22.04。大概意思就是在 Ubuntu 22.04 上默认安装的就是 3.4.x
版本,要想安装就只能源码编译安装了。无奈,开启了源码编译安装的旅程。
首先搞了一台 Ubuntu 22.04 版本的服务器,安装上了 go
, 并且确保 go
安装成功:
go version
go version go1.22.1 linux/amd64
接着安装依赖,这个可以直接查看源码编译的官方指南。
apt-get install \
btrfs-progs \
crun \
git \
golang-go \
go-md2man \
iptables \
libassuan-dev \
libbtrfs-dev \
libc6-dev \
libdevmapper-dev \
libglib2.0-dev \
libgpgme-dev \
libgpg-error-dev \
libprotobuf-dev \
libprotobuf-c-dev \
libseccomp-dev \
libselinux1-dev \
libsystemd-dev \
netavark \
pkg-config \
uidmap
这时候可能会出现下面的错误:
E: Unable to locate package netavark
这个原因是因为老旧版本的 Ubuntu/Debian 不支持 netavark
这个包,用 containernetworking-plugins
这个包来代替。重新执行上面的命令即可完成所需依赖的安装。
最后要确保用户命名空间参数 kernel.unprivileged_userns_clone
的值为 1。
sysctl kernel.unprivileged_userns_clone=1
Podman 的运行依赖几个组件 conmon
、crun/runc
。
conmon 是一个 OCI 容器运行时监控。主要是在容器管理器(诸如 Podman 和 CRI-O)和 OCI 运行时(诸如 runc 或 crun)之间做一个监控及通信。
使用如下命令即可完成 conmon
的编译安装:
git clone https://github.com/containers/conmon
cd conmon
export GOCACHE="$(mktemp -d)"
make
make podman
runc
或者 crun
就是运行时了,选择哪个都可以,使用如下命令完成 runc
的编译安装:
git clone https://github.com/opencontainers/runc.git $GOPATH/src/github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc
make BUILDTAGS="selinux seccomp"
cp runc /usr/bin/runc
Podman 源码编译安装需要安装 CNI 插件。使用如下命令完成安装:
mkdir -p /etc/containers
curl -L -o /etc/containers/registries.conf https://src.fedoraproject.org/rpms/containers-common/raw/main/f/registries.conf
curl -L -o /etc/containers/policy.json https://src.fedoraproject.org/rpms/containers-common/raw/main/f/default-policy.json
对于 Ubuntu/Debian 还要安装下面这个依赖:
apt-get install -y \
libapparmor-dev
下面进入最后的重要环节,进行 Podman 的编译安装。使用如下命令即可:
git clone https://github.com/containers/podman/
cd podman
make BUILDTAGS="selinux seccomp" PREFIX=/usr
make install PREFIX=/usr
安装完毕,即可查看 Podman 的版本了:
podman version
Client: Podman Engine
Version: 4.9.3
API Version: 4.9.3
Go Version: go1.22.1
Built: Tue Mar 12 23:06:45 2024
OS/Arch: linux/amd64
可以看到安装了最新的正式版本 4.9.3
。
下面就可以愉快的玩耍了。