Initial commit
This commit is contained in:
commit
21311998af
320
docker-install.sh
Normal file
320
docker-install.sh
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
VERSION="1.0.0"
|
||||||
|
VERSION_NUM="1"
|
||||||
|
LAST_UPDATE="22.03.2025"
|
||||||
|
|
||||||
|
GITLAB_URL="https://gl.wssk.ru/skasatkin/docker-rootless-install"
|
||||||
|
|
||||||
|
GREEN=$(tput setaf 2)
|
||||||
|
RESET=$(tput sgr0)
|
||||||
|
RED=$(tput setaf 1)
|
||||||
|
CYAN=$(tput setaf 6)
|
||||||
|
|
||||||
|
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
|
||||||
|
LOG_DIR="./.docker-install"
|
||||||
|
LOG_FILE="$LOG_DIR/$TIMESTAMP.log"
|
||||||
|
|
||||||
|
mkdir -p "$LOG_DIR"
|
||||||
|
|
||||||
|
find "$LOG_DIR" -type f -mtime +7 -exec rm {} \;
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
echo -e "$1" >> "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
function progress() {
|
||||||
|
echo -ne "\r${CYAN}$1${RESET}\033[K"
|
||||||
|
}
|
||||||
|
|
||||||
|
function done_msg() {
|
||||||
|
echo -e "\r${GREEN}✔ $1${RESET}\033[K"
|
||||||
|
log "✔ $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function error_msg() {
|
||||||
|
echo -e "\r${RED}✖ $1${RESET}\033[K"
|
||||||
|
log "✖ $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_with_live_tail() {
|
||||||
|
local command="$1"
|
||||||
|
local lines=4
|
||||||
|
local buffer=()
|
||||||
|
local prev_output=""
|
||||||
|
|
||||||
|
echo -e "${CYAN}$progress_message${RESET}"
|
||||||
|
|
||||||
|
for ((i=0; i<$lines; i++)); do
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
move_cursor_up() {
|
||||||
|
echo -en "\033[${lines}A"
|
||||||
|
}
|
||||||
|
|
||||||
|
eval "$command" 2>&1 | while IFS= read -r line; do
|
||||||
|
log "$line"
|
||||||
|
|
||||||
|
if [[ "$line" == "$prev_output" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
prev_output="$line"
|
||||||
|
|
||||||
|
buffer+=("$line")
|
||||||
|
if [ "${#buffer[@]}" -gt "$lines" ]; then
|
||||||
|
buffer=("${buffer[@]: -$lines}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
move_cursor_up
|
||||||
|
|
||||||
|
for ((i=0; i<$lines; i++)); do
|
||||||
|
local output="${buffer[$i]}"
|
||||||
|
echo -en "\033[2K"
|
||||||
|
echo "$output"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
move_cursor_up
|
||||||
|
for ((i=0; i<$lines; i++)); do
|
||||||
|
echo -en "\033[2K"
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function self_update() {
|
||||||
|
echo -e "${CYAN}Проверка обновлений...${RESET}"
|
||||||
|
|
||||||
|
version_file=$(curl -s "$GITLAB_URL/-/raw/main/version")
|
||||||
|
|
||||||
|
remote_version=$(echo "$version_file" | grep VERSION= | cut -d '=' -f2 | tr -d '"' | tr -d '\r')
|
||||||
|
remote_version_num=$(echo "$version_file" | grep VERSION_NUM= | cut -d '=' -f2 | tr -d '"' | tr -d '\r')
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "${CYAN}Получена версия: ${remote_version} (${remote_version_num})${RESET}"
|
||||||
|
|
||||||
|
if [[ $remote_version_num -gt $VERSION_NUM ]]; then
|
||||||
|
echo -e "${GREEN}Доступна новая версия: ${remote_version} (${remote_version_num})${RESET}"
|
||||||
|
echo -e "${CYAN}Скачиваю обновление...${RESET}"
|
||||||
|
|
||||||
|
curl -s -o docker-install.sh "$GITLAB_URL/-/raw/main/docker-install.sh" && \
|
||||||
|
chmod +x docker-install.sh
|
||||||
|
|
||||||
|
echo -e "${GREEN}✅ Обновление завершено! Перезапусти скрипт.${RESET}"
|
||||||
|
f_exit
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}Установлена последняя версия: $VERSION${RESET}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function install_docker() {
|
||||||
|
clear
|
||||||
|
log "=== Установка Docker (rootless)... ==="
|
||||||
|
echo -e "${GREEN}Установка Docker (rootless)...${RESET}"
|
||||||
|
|
||||||
|
if [ -f "$HOME/bin/dockerd" ]; then
|
||||||
|
error_msg "⚠️ Rootless Docker уже установлен в $HOME/bin/dockerd"
|
||||||
|
echo ""
|
||||||
|
echo "👉 Для переустановки останови и удали:"
|
||||||
|
echo " systemctl --user stop docker"
|
||||||
|
echo " rm -f ~/bin/dockerd"
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}❗ Возвращаюсь в меню через 5 секунд...${RESET}"
|
||||||
|
sleep 5
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
progress_message="⏳ Устанавливаю Docker (rootless)..."
|
||||||
|
run_with_live_tail "curl -fsSL https://get.docker.com/rootless | sh'"
|
||||||
|
clear
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
done_msg "Docker успешно установлен!"
|
||||||
|
else
|
||||||
|
error_msg "Ошибка при установке Docker!"
|
||||||
|
sleep 5
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
progress "⏳ Добавляю переменные окружения..."
|
||||||
|
grep -qxF 'export PATH=$HOME/bin:$PATH' ~/.bashrc || echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
|
||||||
|
grep -qxF 'export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock' ~/.bashrc || echo 'export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock' >> ~/.bashrc
|
||||||
|
source ~/.bashrc
|
||||||
|
done_msg "Переменные окружения добавлены."
|
||||||
|
|
||||||
|
echo -e "${CYAN}ℹ️ Но они могут не примениться. Поэтому перезайди в сессию или выполни:${RESET}"
|
||||||
|
echo -e "source ~/.bashrc"
|
||||||
|
|
||||||
|
progress "⏳ Запускаю и активирую Docker (user systemd)..."
|
||||||
|
systemctl --user start docker
|
||||||
|
systemctl --user enable docker
|
||||||
|
done_msg "Docker запущен и добавлен в автозагрузку."
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_compose() {
|
||||||
|
clear
|
||||||
|
log "=== Установка Docker Compose... ==="
|
||||||
|
echo -e "${GREEN}Установка Docker Compose...${RESET}"
|
||||||
|
|
||||||
|
if [ -f "$HOME/.docker/cli-plugins/docker-compose" ]; then
|
||||||
|
error_msg "⚠️ Docker Compose уже установлен в ~/.docker/cli-plugins/docker-compose"
|
||||||
|
echo ""
|
||||||
|
echo "👉 Для переустановки удали:"
|
||||||
|
echo " rm -f ~/.docker/cli-plugins/docker-compose"
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}❗ Возвращаюсь в меню через 5 секунд...${RESET}"
|
||||||
|
sleep 5
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
progress "⏳ Создаю папку для docker-compose..."
|
||||||
|
mkdir -p ~/.docker/cli-plugins/
|
||||||
|
done_msg "Папка ~/.docker/cli-plugins готова."
|
||||||
|
|
||||||
|
progress_message="⏳ Скачиваю Docker Compose..."
|
||||||
|
run_with_live_tail "curl -SL \"https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64\" -o ~/.docker/cli-plugins/docker-compose"
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
done_msg "Docker Compose скачан!"
|
||||||
|
else
|
||||||
|
error_msg "Ошибка при скачивании Docker Compose!"
|
||||||
|
sleep 5
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
progress "⏳ Делаю docker-compose исполняемым..."
|
||||||
|
chmod +x ~/.docker/cli-plugins/docker-compose
|
||||||
|
done_msg "Права на выполнение добавлены."
|
||||||
|
|
||||||
|
progress "⏳ Добавляю docker-compose в PATH..."
|
||||||
|
grep -qxF 'export PATH=$HOME/.docker/cli-plugins:$PATH' ~/.bashrc || echo 'export PATH=$HOME/.docker/cli-plugins:$PATH' >> ~/.bashrc
|
||||||
|
source ~/.bashrc
|
||||||
|
done_msg "Переменная окружения обновлена."
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function remove_docker() {
|
||||||
|
clear
|
||||||
|
log "=== Удаление Rootless Docker ==="
|
||||||
|
echo -e "${RED}⚠️ Это удалит Rootless Docker, Compose и ВСЕ данные пользователя!${RESET}"
|
||||||
|
|
||||||
|
whiptail --title "Удаление Rootless Docker" --yesno "Действительно хочешь удалить Rootless Docker, Compose и ВСЕ данные?" 12 60
|
||||||
|
response=$?
|
||||||
|
|
||||||
|
if [[ $response -eq 0 ]]; then
|
||||||
|
progress "⏳ Удаляю контейнеры, тома и образы..."
|
||||||
|
if command -v docker >/dev/null 2>&1; then
|
||||||
|
docker container rm -f $(docker ps -aq) 2>/dev/null
|
||||||
|
docker volume rm $(docker volume ls -q) 2>/dev/null
|
||||||
|
docker image rm -f $(docker image ls -q) 2>/dev/null
|
||||||
|
done_msg "Контейнеры, тома и образы удалены."
|
||||||
|
else
|
||||||
|
error_msg "Docker не найден. Пропускаю удаление контейнеров и томов."
|
||||||
|
fi
|
||||||
|
|
||||||
|
progress "⏳ Останавливаю Rootless Docker (user)..."
|
||||||
|
systemctl --user stop docker 2>/dev/null
|
||||||
|
systemctl --user disable docker 2>/dev/null
|
||||||
|
done_msg "Rootless Docker остановлен."
|
||||||
|
|
||||||
|
progress "⏳ Удаляю systemd user сервисы..."
|
||||||
|
rm -f ~/.config/systemd/user/docker.service ~/.config/systemd/user/docker.socket
|
||||||
|
done_msg "Юниты удалены."
|
||||||
|
|
||||||
|
progress "⏳ Удаляю исполняемые файлы Docker..."
|
||||||
|
rm -rf ~/bin/docker* 2>/dev/null
|
||||||
|
done_msg "Файлы из ~/bin удалены."
|
||||||
|
|
||||||
|
progress "⏳ Чищу Docker data каталоги..."
|
||||||
|
rm -rf ~/.local/share/docker ~/.docker
|
||||||
|
done_msg "Данные Docker, какие возможно, удалены."
|
||||||
|
echo -e "Если что-то осталось, и важно удалить, напиши мне."
|
||||||
|
|
||||||
|
echo -e "${GREEN}✔ Rootless Docker и все данные удалены!${RESET}"
|
||||||
|
else
|
||||||
|
error_msg "❌ Удаление отменено пользователем."
|
||||||
|
sleep 3
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function f_exit() {
|
||||||
|
log "=== Завершение скрипта ==="
|
||||||
|
log "exit code: ${1:-0}"
|
||||||
|
echo -e "> logfile: $LOG_FILE"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}Версия: $VERSION${RESET}"
|
||||||
|
echo -e "${CYAN}Последнее обновление: $LAST_UPDATE${RESET}"
|
||||||
|
echo -e "> logfile: $LOG_FILE"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}ℹ️ Если менялись переменные окружения, они могут не примениться. Поэтому перезайди в сессию или выполни:${RESET}"
|
||||||
|
echo -e "source ~/.bashrc"
|
||||||
|
exit ${1:-0}
|
||||||
|
}
|
||||||
|
|
||||||
|
function menu() {
|
||||||
|
while true; do
|
||||||
|
CHOICE=$(whiptail --title "Docker & Docker Compose ${VERSION}" --menu "\n\
|
||||||
|
Stеpan Kasatkin\n\
|
||||||
|
Версия: ${VERSION} | Обновлен: ${LAST_UPDATE}\n\n\
|
||||||
|
Выбери действие (стрелки + Enter):" \
|
||||||
|
22 70 10 \
|
||||||
|
"1" "Установить Docker (rootless)" \
|
||||||
|
"2" "Установить Docker Compose" \
|
||||||
|
"3" "Установить Docker + Compose" \
|
||||||
|
"4" "Удалить Docker и ВСЕ данные" \
|
||||||
|
"0" "Выход" 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RETVAL=$?
|
||||||
|
|
||||||
|
if [[ $RETVAL -eq 1 || $RETVAL -eq 255 ]]; then
|
||||||
|
error_msg "❌ Отменено пользователем."
|
||||||
|
f_exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $CHOICE in
|
||||||
|
1)
|
||||||
|
install_docker
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
install_compose
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
install_docker
|
||||||
|
docker_status=$?
|
||||||
|
install_compose
|
||||||
|
compose_status=$?
|
||||||
|
|
||||||
|
if [[ $docker_status -eq 0 && $compose_status -eq 0 ]]; then
|
||||||
|
done_msg "✅ Установка Docker и Compose завершена."
|
||||||
|
echo -e "${GREEN}👉 Проверка версий:${RESET}"
|
||||||
|
echo "docker --version"
|
||||||
|
echo "docker-compose version"
|
||||||
|
f_exit
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
remove_docker
|
||||||
|
;;
|
||||||
|
0)
|
||||||
|
echo -e "${GREEN}Выход...${RESET}"
|
||||||
|
f_exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error_msg "❌ Неверный выбор!"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
clear
|
||||||
|
echo -e "${GREEN}Docker & Docker Compose, Stepan Kasatkin${RESET}"
|
||||||
|
log "=== Запуск установщика Docker & Compose ==="
|
||||||
|
self_update
|
||||||
|
menu
|
||||||
Loading…
x
Reference in New Issue
Block a user