import subprocess from pathlib import Path import decman from decman import Module from decman.plugins.pacman import packages as pacman_packages from decman.plugins.systemd import units def _is_wsl() -> bool: """检测是否在 WSL 环境""" try: return "microsoft" in Path("/proc/version").read_text().lower() except OSError: return False class DockerModule(Module): def __init__(self, user: str): super().__init__("docker") self.user = user self._is_wsl = _is_wsl() @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: object) -> None: self._ensure_user_in_docker_group() if self._is_wsl: self._disable_networkd_wait_online() def _ensure_user_in_docker_group(self) -> None: result = subprocess.run( ["id", "-nG", self.user], capture_output=True, text=True, check=False, ) if result.returncode != 0: decman.error(f"无法读取用户 {self.user} 的组信息") return if "docker" not in result.stdout.split(): decman.prg(["gpasswd", "-a", self.user, "docker"]) def _disable_networkd_wait_online(self) -> None: """WSL 环境:禁用 systemd-networkd-wait-online 避免启动阻塞""" result = subprocess.run( ["systemctl", "is-enabled", "systemd-networkd-wait-online.service"], capture_output=True, text=True, check=False, ) if result.returncode == 0 and result.stdout.strip() == "enabled": decman.prg(["systemctl", "disable", "systemd-networkd-wait-online.service"])