#!/usr/bin/env bash set -Eeuo pipefail if [[ "${EUID}" -ne 0 ]]; then echo '请使用 sudo 运行此脚本。' >&2 exit 1 fi if [[ ! -r /etc/os-release ]]; then echo '无法识别操作系统。' >&2 exit 1 fi # shellcheck disable=SC1091 source /etc/os-release if [[ "${ID:-}" != 'ubuntu' || "${VERSION_ID:-}" != '26.04' ]]; then printf '本部署包仅验证 Ubuntu 26.04;当前为 %s %s。\n' "${ID:-unknown}" "${VERSION_ID:-unknown}" >&2 exit 1 fi if docker version >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then echo 'Docker Engine 与 Compose plugin 已安装。' exit 0 fi conflicts=() for package in docker.io docker-compose docker-compose-v2 podman-docker containerd runc; do if dpkg-query -W -f='${Status}' "$package" 2>/dev/null | grep -q 'install ok installed'; then conflicts+=("$package") fi done if ((${#conflicts[@]})); then printf '检测到可能冲突的软件包:%s\n' "${conflicts[*]}" >&2 echo '请先人工确认并按 Docker 官方文档移除冲突包,再重新运行;脚本不会自动卸载现有容器运行时。' >&2 exit 1 fi apt-get update apt-get install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc architecture="$(dpkg --print-architecture)" codename="${UBUNTU_CODENAME:-${VERSION_CODENAME}}" cat > /etc/apt/sources.list.d/docker.sources <