RHEL 10 Quadlet:把 rootless 容器交给 systemd --user
This content is not available in your language yet.
Quadlet 是 Podman 5 的 systemd 集成:写一个 .container 文件,systemd 生成对应 service,不需要手写 ExecStart=podman run ...。本页用 rootless Podman 把 UBI10 容器做成用户服务。
在 PVE 390 rhel10-lab(RHEL 10.2)以 cloud-user 执行:
mkdir -p ~/.config/containers/systemdcat > ~/.config/containers/systemd/hello.container <<'EOF'[Unit]Description=Hello UBI10
[Container]Image=registry.access.redhat.com/ubi10/ubi-minimalExec=sleep infinity
[Install]WantedBy=default.targetEOFsystemctl --user daemon-reloadsystemctl --user start hello.servicesystemctl --user status hello.servicepodman psE3 记录:plans/content-expansion/evidence/rhel/rhel-quadlet/run.json(10 步,含 unit/生成 service/linger/stop 的输出 sha256)。
先给结论:Quadlet 是“声明式 podman run”
Section titled “先给结论:Quadlet 是“声明式 podman run””- unit 文件放
~/.config/containers/systemd/(rootless)或/etc/containers/systemd/(rootful); - 文件名
hello.container→ 生成hello.service; [Container]段写 Image/Exec/Volume/PublishPort;[Install] WantedBy=default.target决定是否随用户会话启动;daemon-reload才会重新生成 unit。
写 unit 并启动
Section titled “写 unit 并启动”$ systemctl --user cat hello.service[Unit]Description=Hello UBI10...Loaded: loaded (.../hello.container; generated) 说明是 Quadlet 生成的,不是手写 unit。
$ systemctl --user start hello.service$ systemctl --user is-active hello.serviceactive$ podman pssystem-hello registry.access.redhat.com/ubi10/ubi-minimal:latest Up 2 seconds容器名默认是 system-<unit名>。
linger:退出登录后还要跑
Section titled “linger:退出登录后还要跑”loginctl show-user cloud-user -p Linger# Linger=nologinctl enable-linger cloud-userloginctl show-user cloud-user -p Linger# Linger=yes没有 linger,最后一个会话退出后 systemd --user 会被清掉,服务跟着停。服务器上的用户级服务基本都要开 linger。
systemctl --user stop hello.servicepodman ps -a# 空Quadlet 的 stop 会把容器删掉(不是只停)。要保留数据,把数据放 volume/宿主目录,不要依赖容器可写层。
删除 unit:
rm ~/.config/containers/systemd/hello.containersystemctl --user daemon-reloadsystemctl --user cat hello.service# No files found for hello.service.| 现象 | 原因 | 处置 |
|---|---|---|
Unit hello.service not found | 没 daemon-reload / 路径不对 | 放对目录,systemctl --user daemon-reload |
| 服务启动即退出 | Image/Exec 写错 | journalctl --user -u hello.service |
| 退出 SSH 后服务停 | 没 enable-linger | loginctl enable-linger <user> |
| 端口绑定失败 | rootless 不能绑 <1024 | 改高位端口或调 ip_unprivileged_port_start |
- unit 在
~/.config/containers/systemd/; -
daemon-reload后再 start; -
systemctl --user cat看到 generated; - 需要常驻则
enable-linger; - 数据放 volume,不依赖容器层;
- stop 后确认容器已删。
未实测与边界
Section titled “未实测与边界”- 未测试 rootful Quadlet(
/etc/containers/systemd/); - 未测试
.volume/.network/.pod类型; - 未测试
PublishPort与 rootless 端口转发; - 未测试 Quadlet 与
podman generate systemd迁移。
- RHEL 10 Podman rootless — subuid/UID 映射
- RHEL 容器与 UBI — UBI 基础
- 官方:Building, running, and managing containers