import subprocess import decman from decman import Module from decman.plugins.pacman import packages as pacman_packages from decman.plugins.systemd import units class DockerModule(Module): def __init__(self, user: str): super().__init__("docker") self.user = user @pacman_packages def pacman_packages(self) -> set[str]: return {"docker", "docker-compose"} @units def units(self) -> set[str]: return {"docker.socket"} def after_update(self, store): self._ensure_user_in_docker_group() self._disable_networkd_wait_online() def _ensure_user_in_docker_group(self): result = subprocess.run( ["id", "-nG", self.user], capture_output=True, text=True ) if result.returncode != 0: return if "docker" not in result.stdout.split(): decman.prg(["gpasswd", "-a", self.user, "docker"]) def _disable_networkd_wait_online(self): # systemd-networkd-wait-online.service 会阻塞 network-online.target # 直到所有 link ready 或 120s 超时,导致 docker.service 启动卡约两分钟 result = subprocess.run( ["systemctl", "is-enabled", "systemd-networkd-wait-online.service"], capture_output=True, text=True, ) if result.stdout.strip() == "enabled": decman.prg(["systemctl", "disable", "systemd-networkd-wait-online.service"])