第 7 章 将软件添加到 UBI 容器中
红帽通用基础镜像 (UBI) 是从 RHEL 内容的子集构建的。UBI 还提供了 RHEL 软件包的一个子集,其可以免费安装并与 UBI 一起使用。要在正在运行的容器中添加或更新软件,您可以使用包含 RPM 软件包和更新的 dnf 软件仓库。UBI 提供了一组预先构建的语言运行时容器镜像,如 Python、Perl、Node.js、Ruby,等等。
要将 UBI 存储库中的软件包添加到正在运行的 UBI 容器中:
-
在 UBI init 和 UBI 标准镜像中,使用
dnf
命令 -
在 UBI 最小镜像上,请使用
microdnf
命令
直接在运行的容器中安装和使用软件包会临时添加一些软件包。更改不会保存在容器镜像中。要使软件包更改持久,请参阅 使用 Buildah 从 Containerfile 构建镜像 部分。
当您将软件添加到 UBI 容器时,其流程与在订阅的 RHEL 主机上或未订阅(或非 RHEL)系统上更新 UBI 的流程有所不同。
7.1. 使用 UBI init 镜像
您可以使用安装并配置 Web 服务器(httpd
)的 Containerfile
构建一个容器,来在容器在主机系统上运行时由 systemd
服务(/sbin/init
)自动启动。podman build
命令使用一个或多个 Containerfiles
中指令和一个指定的构建上下文目录构建镜像。上下文目录可以指定为存档的 URL、Git 存储库或 Containerfile
。如果没有指定上下文目录,则当前工作目录被视为构建上下文,且必须包含 Containerfile
。您还可以使用 --file
选项指定 Containerfile
。
先决条件
-
container-tools
元数据包已安装。
流程
在新目录中创建一个包含以下内容的
Containerfile
:FROM registry.access.redhat.com/ubi9/ubi-init RUN dnf -y install httpd; dnf clean all; systemctl enable httpd; RUN echo "Successful Web Server Test" > /var/www/html/index.html RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf EXPOSE 80 CMD [ "/sbin/init" ]
Containerfile
安装httpd
软件包,使httpd
服务在引导时启动,创建了一个测试文件(index.html
),将 Web 服务器公开给主机(端口 80),并在容器启动时启动systemd
init 服务(/sbin/init
)。构建容器:
# podman build --format=docker -t mysysd .
可选:如果要使用
systemd
运行容器,且在您的系统上启用了 SELinux,您必须设置container_manage_cgroup
布尔值变量:# setsebool -P container_manage_cgroup 1
运行名为
mysysd_run
的容器:# podman run -d --name=mysysd_run -p 80:80 mysysd
mysysd
镜像作为mysysd_run
容器运行,并作为守护进程,容器的端口 80 暴露在主机系统上的端口 80 上。注意在 rootless 模式中,您必须选择主机端口号 >= 1024。例如:
$ podman run -d --name=mysysd -p 8081:80 mysysd
要使用 < 1024 的端口号 ,您必须修改
net.ipv4.ip_unprivileged_port_start
变量:# sysctl net.ipv4.ip_unprivileged_port_start=80
检查容器是否正在运行:
# podman ps a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_run
测试 Web 服务器:
# curl localhost/index.html Successful Web Server Test
其他资源