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


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

## 问题现象

使用 Quadlet 配置容器后，执行 `systemctl --user start my-container.service`，命令卡住约 90 秒后超时。相关问题在社区中时有讨论，例如 [Podman GitHub Issue #24796](https://github.com/containers/podman/issues/24796)。

## 根本原因

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

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

## 解决方案

### 方法一：修改 Quadlet 文件

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

在 `.container` 文件中添加：

```ini
[Quadlet]
DefaultDependencies=false
```

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

```bash
systemctl --user daemon-reload
```

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

### 方法二：手动触发

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

```bash
sudo systemctl start network-online.target
```

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

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

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

```systemd
# /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
```

创建后执行：

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

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


---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/podman-stuck/  

