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.
This commit is contained in:
@@ -25,6 +25,29 @@ dotfile_help_requested "${1:-}" && dotfile_show_help
|
|||||||
|
|
||||||
set -e
|
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() {
|
detect_distro() {
|
||||||
if [ ! -f /etc/os-release ]; then
|
if [ ! -f /etc/os-release ]; then
|
||||||
echo "[ERROR] 未检测到 /etc/os-release,无法识别系统"
|
echo "[ERROR] 未检测到 /etc/os-release,无法识别系统"
|
||||||
@@ -51,14 +74,16 @@ detect_distro() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
remove_conflicting_packages() {
|
remove_conflicting_packages() {
|
||||||
|
local pkg
|
||||||
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
|
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
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
install_prerequisites() {
|
install_prerequisites() {
|
||||||
sudo apt-get update
|
apt_get update
|
||||||
sudo apt-get install -y ca-certificates curl gnupg lsb-release
|
apt_get_install ca-certificates curl gnupg lsb-release
|
||||||
}
|
}
|
||||||
|
|
||||||
add_user_to_docker_group() {
|
add_user_to_docker_group() {
|
||||||
@@ -96,8 +121,8 @@ install_docker_cn() {
|
|||||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=${keyring}] ${repo_base} \
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=${keyring}] ${repo_base} \
|
||||||
${CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
|
${CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
|
||||||
|
|
||||||
sudo apt-get update
|
apt_get update
|
||||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
apt_get_install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
add_user_to_docker_group
|
add_user_to_docker_group
|
||||||
}
|
}
|
||||||
@@ -115,8 +140,8 @@ install_docker_intl() {
|
|||||||
${CODENAME} stable" |
|
${CODENAME} stable" |
|
||||||
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
|
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
|
||||||
|
|
||||||
sudo apt-get update
|
apt_get update
|
||||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
apt_get_install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
add_user_to_docker_group
|
add_user_to_docker_group
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user