Podman 容器启动长时间等待:network-Online.target 依赖问题

使用 Podman 和 Quadlet 管理的容器,有时启动会卡住 90 秒后超时。这个问题通常不是 Podman 本身的问题,而是其 systemd 服务依赖的 network-online.target 未被激活。本文给出三种解决方案。

问题现象

使用 Quadlet 配置容器后,执行 systemctl --user start my-container.service,命令卡住约 90 秒后超时。相关问题在社区中时有讨论,例如 Podman GitHub Issue #24796

根本原因

Quadlet 生成的 systemd 服务单元通常包含一个依赖项:After=network-online.target

network-online.target 是 systemd 中表示网络已完全就绪的目标。但在某些发行版或网络配置下,负责网络管理的组件(如 NetworkManager 或 systemd-networkd)可能没有正确通知 systemd 网络已"在线",导致 network-online.target 永远不被激活,所有依赖它的服务(包括 Podman 容器服务)也永远等待。

解决方案

方法一:修改 Quadlet 文件

如果容器不依赖网络完全就绪即可启动,可以在 Quadlet 文件中禁用默认的网络依赖。

.container 文件中添加:

[Quadlet]
DefaultDependencies=false

这会告诉 Quadlet 生成 service 文件时,不自动添加 After=network-online.target。修改后执行:

systemctl --user daemon-reload

此后重启服务即可正常启动。这个方法只影响特定容器,且持久化生效。

方法二:手动触发

临时方案,适合不打算修改配置文件的情况:

sudo systemctl start network-online.target

这会手动将 network-online.target 标记为已激活,解除所有等待该目标的服务的阻塞。但每次重启系统后需要重新执行。

方法三:创建 dummy 服务自动触发

如果你需要全局解决此问题,可以创建一个 dummy service 自动激活 network-online.target

# /etc/systemd/system/podman-network-online-dummy.service
[Unit]
Description=Activate network-online.target for Podman containers
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/bin/echo Activating network-online.target

[Install]
WantedBy=multi-user.target

创建后执行:

sudo systemctl daemon-reload
sudo systemctl enable --now podman-network-online-dummy.service

这个服务本身只是一个占位,但它的 Wants=network-online.targetAfter=network-online.target 会在启动时正确触发 network-online.target,使其被正常激活。