feat: install Compose v2 when apt plugin is missing

Add lib-compose-v2.sh: try docker-compose-plugin from APT only if indexed,
otherwise download official CLI plugin from GitHub Releases. quick-install
bootstraps via curl before clone; install/update reuse the helper from repo.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Андрей Бобырев
2026-05-15 00:40:57 +03:00
parent f30b4fc4cf
commit 141753d2ba
6 changed files with 173 additions and 46 deletions

123
scripts/lib-compose-v2.sh Normal file
View File

@@ -0,0 +1,123 @@
#!/usr/bin/env bash
# Функции для проверки и установки Docker Compose v2 («docker compose»).
# Файл предназначен для source из quick-install (через curl) и из install/update.
compose_plugin_download_name_for_arch() {
case "$(uname -m)" in
x86_64 | amd64)
printf '%s' docker-compose-linux-x86_64
;;
aarch64 | arm64)
printf '%s' docker-compose-linux-aarch64
;;
armv7l)
printf '%s' docker-compose-linux-armv7
;;
*)
printf '%s' ''
;;
esac
}
compose_v2_ok() {
docker compose version >/dev/null 2>&1
}
print_compose_v2_help_text() {
cat <<'EOF'
Нужен Docker Compose v2 — команда «docker compose».
• Быстро (если хотите ставить только плагин, без нашего автозагрузчика):
sudo mkdir -p /usr/local/lib/docker/cli-plugins
ARCH=$(uname -m)
case "$ARCH" in x86_64|amd64) N=docker-compose-linux-x86_64 ;; aarch64|arm64) N=docker-compose-linux-aarch64 ;; *) echo "Архитектура не поддерживается: $ARCH"; exit 1 ;; esac
sudo curl -fsSL "https://github.com/docker/compose/releases/download/v2.36.0/${N}" -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version
• Если удобнее через репозиторий Docker CE (Ubuntu):
см. https://docs.docker.com/engine/install/ubuntu/
После добавления repo: sudo apt-get update && sudo apt-get install -y docker-compose-plugin
• Принудительно отключить авто‑скачивание плагина из quick-install/install:
DISABLE_STANDALONE_COMPOSE_DOWNLOAD=1
• Версия релиза GitHub задаётся переменной COMPOSE_CLI_VERSION (по умолчанию v2.36.0).
EOF
}
try_apt_install_docker_compose_plugin() {
command -v apt-get >/dev/null 2>&1 || return 1
if ! apt-cache show docker-compose-plugin >/dev/null 2>&1; then
return 1
fi
local cand=""
cand="$(apt-cache policy docker-compose-plugin 2>/dev/null | awk '/^ Candidate:/ {print $2; exit}')"
if [[ -z "${cand}" || "${cand}" == "(none)" ]]; then
return 1
fi
echo "→ APT: устанавливаю docker-compose-plugin..." >&2
DEBIAN_FRONTEND=noninteractive apt-get update -qq ||
DEBIAN_FRONTEND=noninteractive apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose-plugin
}
install_compose_v2_cli_plugin_standalone() {
local name version url plugin_dir tmp target
name="$(compose_plugin_download_name_for_arch)"
if [[ -z "${name}" ]]; then
echo "Ошибка: архитектура $(uname -m) не поддерживается авто‑установкой Compose v2." >&2
return 1
fi
version="${COMPOSE_CLI_VERSION:-v2.36.0}"
url="https://github.com/docker/compose/releases/download/${version}/${name}"
plugin_dir="${COMPOSE_CLI_PLUGIN_DIR:-/usr/local/lib/docker/cli-plugins}"
target="${plugin_dir}/docker-compose"
tmp="${target}.tmp.$$"
echo "→ Скачиваю Docker Compose ${version}${target}" >&2
mkdir -p "${plugin_dir}"
curl -fsSL "${url}" -o "${tmp}"
chmod +x "${tmp}"
mv -f "${tmp}" "${target}"
}
# Требует root для APT/записи в /usr/local (у standalone).
ensure_compose_v2() {
if compose_v2_ok; then
return 0
fi
echo "Не найдена команда «docker compose» (Compose v2)." >&2
echo "Старый «docker-compose» 1.x из apt здесь не подходит (ошибка ContainerConfig на новых образах)." >&2
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
print_compose_v2_help_text >&2
return 1
fi
if try_apt_install_docker_compose_plugin && compose_v2_ok; then
docker compose version | head -n1 >&2
return 0
fi
if [[ "${DISABLE_STANDALONE_COMPOSE_DOWNLOAD:-}" == "1" ]]; then
print_compose_v2_help_text >&2
return 1
fi
if ! install_compose_v2_cli_plugin_standalone || ! compose_v2_ok; then
print_compose_v2_help_text >&2
return 1
fi
docker compose version | head -n1 >&2
}