跳转到内容
搜索 RHEL 文档

    浏览当前文档目录

    RHEL 10 Quadlet:把 rootless 容器交给 systemd --user

    Quadlet 是 Podman 5 的 systemd 集成:写一个 .container 文件,systemd 生成对应 service,不需要手写 ExecStart=podman run ...。本页用 rootless Podman 把 UBI10 容器做成用户服务。

    在 PVE 390 rhel10-lab(RHEL 10.2)以 cloud-user 执行:

    Terminal window
    mkdir -p ~/.config/containers/systemd
    cat > ~/.config/containers/systemd/hello.container <<'EOF'
    [Unit]
    Description=Hello UBI10
    [Container]
    Image=registry.access.redhat.com/ubi10/ubi-minimal
    Exec=sleep infinity
    [Install]
    WantedBy=default.target
    EOF
    systemctl --user daemon-reload
    systemctl --user start hello.service
    systemctl --user status hello.service
    podman ps

    E3 记录: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。
    /home/cloud-user/.config/containers/systemd/hello.container
    $ 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.service
    active
    $ podman ps
    system-hello registry.access.redhat.com/ubi10/ubi-minimal:latest Up 2 seconds

    容器名默认是 system-<unit名>。

    Terminal window
    loginctl show-user cloud-user -p Linger
    # Linger=no
    loginctl enable-linger cloud-user
    loginctl show-user cloud-user -p Linger
    # Linger=yes

    没有 linger,最后一个会话退出后 systemd --user 会被清掉,服务跟着停。服务器上的用户级服务基本都要开 linger。

    Terminal window
    systemctl --user stop hello.service
    podman ps -a
    # 空

    Quadlet 的 stop 会把容器删掉(不是只停)。要保留数据,把数据放 volume/宿主目录,不要依赖容器可写层。

    删除 unit:

    Terminal window
    rm ~/.config/containers/systemd/hello.container
    systemctl --user daemon-reload
    systemctl --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-lingerloginctl enable-linger <user>
    端口绑定失败rootless 不能绑 <1024改高位端口或调 ip_unprivileged_port_start
    • unit 在 ~/.config/containers/systemd/;
    • daemon-reload 后再 start;
    • systemctl --user cat 看到 generated;
    • 需要常驻则 enable-linger;
    • 数据放 volume,不依赖容器层;
    • stop 后确认容器已删。
    • 未测试 rootful Quadlet(/etc/containers/systemd/);
    • 未测试 .volume/.network/.pod 类型;
    • 未测试 PublishPort 与 rootless 端口转发;
    • 未测试 Quadlet 与 podman generate systemd 迁移。