From c95a1d70b1e789a1241e5715d64df4d3d5bb536e Mon Sep 17 00:00:00 2001 From: laily Date: Sat, 29 Aug 2026 14:37:36 +0800 Subject: [PATCH] fix: docker-install skip installed packages and suspend needrestart Avoid upgrading already-installed packages and restarting unrelated services on Ubuntu 24.04, where apt-pinvoke -m u overrides NEEDRESTART_MODE. --- script/docker-install.sh | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/script/docker-install.sh b/script/docker-install.sh index 38c9cd2..0970f21 100644 --- a/script/docker-install.sh +++ b/script/docker-install.sh @@ -25,6 +25,29 @@ dotfile_help_requested "${1:-}" && dotfile_show_help set -e +# Ubuntu 24.04 的 apt hook 给 needrestart 传 -m u(强制重启服务),会覆盖 +# NEEDRESTART_MODE;只有 NEEDRESTART_SUSPEND 能让 hook 直接跳过。 +apt_get() { + sudo env DEBIAN_FRONTEND=noninteractive NEEDRESTART_SUSPEND=1 apt-get "$@" +} + +pkg_installed() { + [ "$(dpkg-query -W -f='${Status}' "$1" 2>/dev/null)" = "install ok installed" ] +} + +# 只补缺,不升级已装包。已全部装好则不调用 apt,避免触发 needrestart。 +apt_get_install() { + local missing=() + local pkg + for pkg in "$@"; do + pkg_installed "$pkg" || missing+=("$pkg") + done + if [ ${#missing[@]} -eq 0 ]; then + return 0 + fi + apt_get install -y --no-install-recommends --no-upgrade "${missing[@]}" +} + detect_distro() { if [ ! -f /etc/os-release ]; then echo "[ERROR] 未检测到 /etc/os-release,无法识别系统" @@ -51,14 +74,16 @@ detect_distro() { } remove_conflicting_packages() { + local pkg for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do - sudo apt-get remove -y $pkg 2>/dev/null || true + pkg_installed "$pkg" || continue + apt_get remove -y "$pkg" || true done } install_prerequisites() { - sudo apt-get update - sudo apt-get install -y ca-certificates curl gnupg lsb-release + apt_get update + apt_get_install ca-certificates curl gnupg lsb-release } add_user_to_docker_group() { @@ -96,8 +121,8 @@ install_docker_cn() { echo "deb [arch=$(dpkg --print-architecture) signed-by=${keyring}] ${repo_base} \ ${CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null - sudo apt-get update - sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + apt_get update + apt_get_install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin add_user_to_docker_group } @@ -115,8 +140,8 @@ install_docker_intl() { ${CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null - sudo apt-get update - sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + apt_get update + apt_get_install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin add_user_to_docker_group }