Skip to content

Commit a5c37fc

Browse files
yeagooclaude
andcommitted
feat: 新增 EL10 兼容处理、Alinux 4 映射 EL9,并修复默认选项
- 新增 EL10+ 预安装步骤:移除冲突包、安装 kernel-modules-extra、加载并持久化内核模块 - Docker 启动失败时检测新内核未重启并提示用户 - Alibaba Cloud Linux 4 映射到 centos/9 仓库 - 操作模式选择按 Enter 默认选择选项 1(安装模式) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent be0482c commit a5c37fc

1 file changed

Lines changed: 127 additions & 3 deletions

File tree

docker.sh

Lines changed: 127 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ init_messages_en() {
5555
[service_started]="Docker service started"
5656
[service_start_failed]="Docker service failed to start, checking logs..."
5757
[service_start_tip]="Tip: Try starting manually with: sudo dockerd &"
58+
[kernel_reboot_hint]="A newer kernel (%s) is installed but not running (current: %s). Reboot to load the new kernel and its modules, then Docker should start normally."
59+
[reboot_command]="Run: reboot"
60+
[removing_conflicts]="Removing conflicting packages (podman, buildah, etc.)..."
61+
[conflicts_removed]="Conflicting packages removed"
62+
[installing_kernel_modules]="Installing kernel-modules-extra (required for Docker networking on EL10+)..."
63+
[kernel_modules_installed]="kernel-modules-extra installed"
64+
[loading_kernel_modules]="Loading required kernel modules..."
65+
[kernel_modules_loaded]="Kernel modules loaded and persisted"
66+
[kernel_modules_load_failed]="Failed to load kernel modules (may need reboot for new kernel)"
5867
[configuring_mirror]="Configuring mirror acceleration..."
5968
[backup_ok]="Existing config backed up"
6069
[no_dns_added]="No DNS configured, added Docker DNS automatically"
@@ -174,6 +183,15 @@ init_messages_zh() {
174183
[service_started]="Docker 服务启动成功"
175184
[service_start_failed]="Docker 服务启动失败,尝试查看日志..."
176185
[service_start_tip]="可尝试手动启动: sudo dockerd &"
186+
[kernel_reboot_hint]="检测到已安装新内核 (%s) 但当前运行的是旧内核 (%s)。请重启服务器以加载新内核及其模块,之后 Docker 应可正常启动。"
187+
[reboot_command]="执行: reboot"
188+
[removing_conflicts]="正在移除冲突的软件包 (podman, buildah 等)..."
189+
[conflicts_removed]="冲突软件包已移除"
190+
[installing_kernel_modules]="正在安装 kernel-modules-extra(EL10+ Docker 网络所需)..."
191+
[kernel_modules_installed]="kernel-modules-extra 已安装"
192+
[loading_kernel_modules]="正在加载所需内核模块..."
193+
[kernel_modules_loaded]="内核模块已加载并持久化"
194+
[kernel_modules_load_failed]="内核模块加载失败(可能需要重启以使用新内核)"
177195
[configuring_mirror]="配置镜像加速..."
178196
[backup_ok]="已备份现有配置"
179197
[no_dns_added]="系统未配置 DNS,已自动添加 Docker DNS"
@@ -358,6 +376,27 @@ setup_sudo() {
358376
fi
359377
}
360378

379+
# Check if a newer kernel is installed but not yet running
380+
# If so, a reboot is likely needed for Docker to work (missing kernel modules)
381+
check_kernel_reboot_needed() {
382+
local running_kernel newest_kernel
383+
running_kernel=$(uname -r)
384+
385+
# Get list of installed kernels sorted by version, pick the newest
386+
if command -v rpm &>/dev/null; then
387+
newest_kernel=$(rpm -q kernel-core --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n' 2>/dev/null | sort -V | tail -1)
388+
elif command -v dpkg &>/dev/null; then
389+
newest_kernel=$(dpkg -l 'linux-image-*' 2>/dev/null | awk '/^ii/{print $2}' | sed 's/linux-image-//' | sort -V | tail -1)
390+
fi
391+
392+
if [[ -n "$newest_kernel" && "$newest_kernel" != "$running_kernel" ]]; then
393+
echo ""
394+
msg kernel_reboot_hint "$newest_kernel" "$running_kernel"
395+
msg reboot_command
396+
echo ""
397+
fi
398+
}
399+
361400
# Clean up temp files on exit
362401
cleanup() {
363402
rm -f /tmp/docker.tgz /tmp/docker-ce-install.log /tmp/docker-ce-install-retry.log /tmp/docker-ce-install-mirror.log 2>/dev/null || true
@@ -423,12 +462,16 @@ if [[ "${TEST_MODE:-0}" == "1" ]]; then
423462
;;
424463

425464
alinux)
426-
if [[ "$VERSION_MAJOR" -ge 3 ]]; then
465+
if [[ "$VERSION_MAJOR" -ge 4 ]]; then
466+
PKG_MANAGER="dnf"
467+
REPO_PATH="centos/9"
468+
elif [[ "$VERSION_MAJOR" -ge 3 ]]; then
427469
PKG_MANAGER="dnf"
470+
REPO_PATH="centos/8"
428471
else
429472
PKG_MANAGER="yum"
473+
REPO_PATH="centos/8"
430474
fi
431-
REPO_PATH="centos/8"
432475
;;
433476

434477
kylin)
@@ -629,6 +672,71 @@ setup_deb_repo() {
629672
return 1
630673
}
631674

675+
# ============================================================
676+
# Pre-install preparation
677+
# ============================================================
678+
679+
# Remove conflicting packages (Podman, Buildah, etc.)
680+
# Required on EL systems where these are pre-installed
681+
remove_conflicting_packages() {
682+
local pkg_mgr="$1"
683+
local conflicts=(podman buildah containers-common docker docker-client
684+
docker-client-latest docker-common docker-latest docker-latest-logrotate
685+
docker-logrotate docker-engine)
686+
local found=false
687+
688+
for pkg in "${conflicts[@]}"; do
689+
if rpm -q "$pkg" &>/dev/null 2>&1; then
690+
found=true
691+
break
692+
fi
693+
done
694+
695+
if [[ "$found" == "true" ]]; then
696+
msg removing_conflicts
697+
sudo "$pkg_mgr" remove -y "${conflicts[@]}" 2>/dev/null || true
698+
msg conflicts_removed
699+
fi
700+
}
701+
702+
# Ensure required kernel modules are available on EL10+
703+
# EL10 removed ip_tables module; Docker needs xt_addrtype, br_netfilter, overlay
704+
prepare_kernel_modules() {
705+
local pkg_mgr="$1"
706+
local version_major="$2"
707+
708+
# Only needed for EL10+
709+
if [[ "$version_major" -lt 10 ]]; then
710+
return 0
711+
fi
712+
713+
# Install kernel-modules-extra if not present
714+
if ! rpm -q kernel-modules-extra &>/dev/null 2>&1; then
715+
msg installing_kernel_modules
716+
sudo "$pkg_mgr" install -y kernel-modules-extra 2>/dev/null || true
717+
msg kernel_modules_installed
718+
fi
719+
720+
# Load required kernel modules
721+
msg loading_kernel_modules
722+
local all_loaded=true
723+
for mod in xt_addrtype br_netfilter overlay; do
724+
if ! modprobe "$mod" 2>/dev/null; then
725+
all_loaded=false
726+
fi
727+
done
728+
729+
if [[ "$all_loaded" == "true" ]]; then
730+
# Persist across reboots
731+
for mod in xt_addrtype br_netfilter overlay; do
732+
echo "$mod" | sudo tee "/etc/modules-load.d/${mod}.conf" > /dev/null 2>/dev/null || true
733+
done
734+
msg kernel_modules_loaded
735+
else
736+
msg kernel_modules_load_failed
737+
fi
738+
}
739+
632740
# ============================================================
633741
# Docker installation functions
634742
# ============================================================
@@ -874,6 +982,10 @@ start_docker_service() {
874982
msg service_start_failed
875983
sudo journalctl -xeu docker.service --no-pager -n 20 2>/dev/null || \
876984
sudo systemctl status docker --no-pager -l 2>/dev/null || true
985+
986+
# Check if a newer kernel is installed but not yet booted
987+
check_kernel_reboot_needed
988+
877989
msg service_start_tip
878990
DOCKER_RUNNING=false
879991
fi
@@ -1193,7 +1305,10 @@ detect_install_strategy() {
11931305

11941306
alinux)
11951307
INSTALL_TYPE="rpm"
1196-
if [[ "${VERSION_ID%%.*}" -ge 3 ]]; then
1308+
if [[ "${VERSION_ID%%.*}" -ge 4 ]]; then
1309+
CENTOS_VERSION="9"
1310+
PKG_MANAGER="dnf"
1311+
elif [[ "${VERSION_ID%%.*}" -ge 3 ]]; then
11971312
CENTOS_VERSION="8"
11981313
PKG_MANAGER="dnf"
11991314
else
@@ -1334,6 +1449,7 @@ main() {
13341449
# shellcheck disable=SC2059
13351450
printf "$(msg enter_choice "1/2")" ""
13361451
read -r mode_input
1452+
mode_input="${mode_input:-1}"
13371453
case "$mode_input" in
13381454
1) run_mode="install"; break ;;
13391455
2) run_mode="mirror"; break ;;
@@ -1450,6 +1566,14 @@ main() {
14501566
# Detect install strategy
14511567
detect_install_strategy
14521568

1569+
# Pre-install: remove conflicting packages and prepare kernel modules (RPM-based)
1570+
case "$INSTALL_TYPE" in
1571+
rpm|fedora)
1572+
remove_conflicting_packages "$PKG_MANAGER"
1573+
prepare_kernel_modules "$PKG_MANAGER" "${VERSION_ID%%.*}"
1574+
;;
1575+
esac
1576+
14531577
# Configure Docker source
14541578
msg configuring_source
14551579

0 commit comments

Comments
 (0)