Files
amnezia-web-pro-deploy/scripts/lib-compose-v2.sh
Андрей Бобырев 141753d2ba 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>
2026-05-15 00:40:57 +03:00

124 lines
4.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
}