Добавить server/docker-installer.sh
This commit is contained in:
186
server/docker-installer.sh
Normal file
186
server/docker-installer.sh
Normal file
@@ -0,0 +1,186 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Installs Docker Engine + Docker Compose plugin on Ubuntu/Debian or RHEL-like (CentOS/Rocky/Alma).
|
||||
# Adds a user to the "docker" group (so they can run docker without sudo).
|
||||
#
|
||||
# Usage:
|
||||
# sudo ./install-docker.sh
|
||||
# sudo ./install-docker.sh --user username
|
||||
# sudo ./install-docker.sh --user username --no-docker-group
|
||||
#
|
||||
# Notes:
|
||||
# - After adding a user to docker group, they must re-login (or run: newgrp docker).
|
||||
|
||||
TARGET_USER=""
|
||||
ADD_TO_DOCKER_GROUP="1"
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
install-docker.sh [--user <username>] [--no-docker-group]
|
||||
|
||||
Options:
|
||||
--user <username> Add this user to docker group (default: current sudo user if set)
|
||||
--no-docker-group Do not add any user to docker group
|
||||
-h, --help Show help
|
||||
EOF
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--user)
|
||||
[[ $# -ge 2 ]] || { echo "Missing value for --user" >&2; usage; exit 2; }
|
||||
TARGET_USER="$2"
|
||||
shift 2
|
||||
;;
|
||||
--no-docker-group)
|
||||
ADD_TO_DOCKER_GROUP="0"
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown argument: $1" >&2
|
||||
usage
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "${EUID}" -ne 0 ]]; then
|
||||
echo "Run as root (sudo)." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Default user: the sudo invoker (if any), else empty
|
||||
if [[ -z "${TARGET_USER}" && -n "${SUDO_USER:-}" && "${SUDO_USER}" != "root" ]]; then
|
||||
TARGET_USER="${SUDO_USER}"
|
||||
fi
|
||||
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
echo "Docker already installed: $(docker --version || true)"
|
||||
fi
|
||||
|
||||
detect_os() {
|
||||
if [[ -r /etc/os-release ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
. /etc/os-release
|
||||
echo "${ID:-unknown}" "${VERSION_CODENAME:-}" "${VERSION_ID:-}"
|
||||
else
|
||||
echo "unknown" "" ""
|
||||
fi
|
||||
}
|
||||
|
||||
ID="" CODENAME="" VERSION_ID=""
|
||||
read -r ID CODENAME VERSION_ID < <(detect_os)
|
||||
|
||||
echo "Detected OS: ID=${ID} CODENAME=${CODENAME} VERSION_ID=${VERSION_ID}"
|
||||
|
||||
setup_daemon_json() {
|
||||
mkdir -p /etc/docker
|
||||
if [[ ! -f /etc/docker/daemon.json ]]; then
|
||||
cat > /etc/docker/daemon.json <<'JSON'
|
||||
{
|
||||
"log-driver": "json-file",
|
||||
"log-opts": {
|
||||
"max-size": "10m",
|
||||
"max-file": "3"
|
||||
}
|
||||
}
|
||||
JSON
|
||||
echo "Created /etc/docker/daemon.json (log rotation)."
|
||||
else
|
||||
echo "/etc/docker/daemon.json already exists; leaving as-is."
|
||||
fi
|
||||
}
|
||||
|
||||
install_debian_ubuntu() {
|
||||
apt-get update
|
||||
apt-get -y install ca-certificates curl gnupg
|
||||
|
||||
install -m 0755 -d /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/${ID}/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
chmod a+r /etc/apt/keyrings/docker.gpg
|
||||
|
||||
ARCH="$(dpkg --print-architecture)"
|
||||
CODENAME_LOCAL="${CODENAME}"
|
||||
if [[ -z "${CODENAME_LOCAL}" ]]; then
|
||||
CODENAME_LOCAL="$(. /etc/os-release && echo "${VERSION_CODENAME}")"
|
||||
fi
|
||||
|
||||
cat > /etc/apt/sources.list.d/docker.list <<EOF
|
||||
deb [arch=${ARCH} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${ID} ${CODENAME_LOCAL} stable
|
||||
EOF
|
||||
|
||||
apt-get update
|
||||
apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
}
|
||||
|
||||
install_rhel_like() {
|
||||
# Works for: centos/rhel/almalinux/rocky/fedora (docker provides packages for many of these)
|
||||
if command -v dnf >/dev/null 2>&1; then
|
||||
PM="dnf"
|
||||
else
|
||||
PM="yum"
|
||||
fi
|
||||
|
||||
$PM -y install yum-utils ca-certificates curl
|
||||
|
||||
# Repo
|
||||
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
||||
|
||||
$PM -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
}
|
||||
|
||||
case "${ID}" in
|
||||
ubuntu|debian)
|
||||
install_debian_ubuntu
|
||||
;;
|
||||
rhel|centos|fedora|rocky|almalinux)
|
||||
install_rhel_like
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported OS ID='${ID}'. Supported: ubuntu, debian, centos/rhel/rocky/almalinux/fedora" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
setup_daemon_json
|
||||
|
||||
systemctl enable docker
|
||||
systemctl restart docker
|
||||
|
||||
# docker group/user permissions
|
||||
if ! getent group docker >/dev/null; then
|
||||
groupadd docker || true
|
||||
fi
|
||||
|
||||
if [[ "${ADD_TO_DOCKER_GROUP}" == "1" && -n "${TARGET_USER}" ]]; then
|
||||
if id "${TARGET_USER}" >/dev/null 2>&1; then
|
||||
usermod -aG docker "${TARGET_USER}"
|
||||
echo "Added user '${TARGET_USER}' to group 'docker'."
|
||||
else
|
||||
echo "User '${TARGET_USER}' not found; skipping docker group assignment." >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "=== Installed ==="
|
||||
docker --version
|
||||
docker compose version
|
||||
|
||||
echo
|
||||
echo "=== Service status ==="
|
||||
systemctl --no-pager --full status docker | sed -n '1,25p' || true
|
||||
|
||||
echo
|
||||
if [[ "${ADD_TO_DOCKER_GROUP}" == "1" && -n "${TARGET_USER}" ]]; then
|
||||
echo "IMPORTANT: user '${TARGET_USER}' must re-login for docker group to apply."
|
||||
echo "Quick test after relogin: docker run --rm hello-world"
|
||||
else
|
||||
echo "To use docker without sudo: add a user to docker group:"
|
||||
echo " sudo usermod -aG docker <username> && newgrp docker"
|
||||
fi
|
||||
Reference in New Issue
Block a user