62 lines
1.9 KiB
Bash
62 lines
1.9 KiB
Bash
#!/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 <<EOF
|
|
Types: deb
|
|
URIs: https://download.docker.com/linux/ubuntu
|
|
Suites: ${codename}
|
|
Components: stable
|
|
Architectures: ${architecture}
|
|
Signed-By: /etc/apt/keyrings/docker.asc
|
|
EOF
|
|
|
|
apt-get update
|
|
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
systemctl enable --now docker
|
|
docker version
|
|
docker compose version
|
|
|
|
echo 'Docker 安装完成。Docker 组等同 root 权限,本脚本不会自动把普通用户加入 docker 组。'
|