Podman rootless 容器等待網路的問題
/ 閱讀時間 3 分鐘
目次
在先前的文章,我有提過可以讓 systemd 服務加上 After=network-online.target 使它在網路可以用(網路管理服務開始)的時候才啟動。但因為 network-online.target 是系統層級的 target unit,所以使用者層級的服務是無法直接依賴 network-online.target 的。
對於 Podman 的 rootless Quadlet 來說也會遇到一樣的問題,所以如果你在 user namespace 的 example.container 中寫 After=network-online.target 是沒有效果的。所以 Podman 引入了 podman-user-wait-network-online.service 以嘗試解決這個問題,這個檔案的全文是這樣的:
[Unit]Description=Wait for system level network-online.target as user.Documentation=https://github.com/containers/podman/issues/22197Documentation=man:podman-systemd.unit(5)
[Service]Type=oneshot# Set a timeout as by default oneshot does not have one and in case network-online.target# never comes online we do not want to block forever, 90s is the default systemd unit timeout.TimeoutStartSec=90sExecStart=/bin/sh -c 'until systemctl is-active network-online.target; do sleep 0.5; done'RemainAfterExit=yes它用 systemctl is-active network-online.target 指令每 0.5 秒追蹤一次 network-online.target 的狀態,如果回傳 active 就代表 network-online.target 已經達到了。
但這個做法有個問題,如果沒有任何 systemd 服務依賴 network-online.target,network-online.target 就會一直維持 inactive,就算網路已經可以正常運作也一樣。對於全新安裝的 Arch Linux 來說,只有在每週的某個時候會執行一次的 archlinux-keyring-wkd-sync.service 會依賴 network-online.target,讓它變 active。
因為 Quadlet 預設會對使用者層級的 Quadlet 檔案加入 podman-user-wait-network-online.service 的依賴關係,所以每次用 Quadlet 開啟或重啟 Podman 容器時都要等一分半讓 podman-user-wait-network-online.service 超時終止後才能啟動。
這個問題到現在都還沒有解決,但在 issue 中有提到很多種變通方式。我覺得最簡單易懂的方式是 issue 原作者提出的,建立一個系統層級的 dummy systemd 服務,只是依賴 network-online.target,讓它能變 active。