diff --git a/Docker-Install.sh b/Docker-Install.sh old mode 100644 new mode 100755 index aa8b843..9bdd908 --- a/Docker-Install.sh +++ b/Docker-Install.sh @@ -1,21 +1,20 @@ -sudo apt update -sudo apt install -y ca-certificates curl gnupg lsb-release -sudo install -m 0755 -d /etc/apt/keyrings -curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg \ - | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -sudo chmod a+r /etc/apt/keyrings/docker.gpg -echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ - https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ - $(lsb_release -cs) stable" \ -| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -sudo apt update -sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -sudo systemctl enable --now docker +#!/usr/bin/env bash +# Backward-compatible entrypoint for the old filename. +# Prefer install-docker.sh for new installs. -#Add user to docker group to use docker without sudo -#sudo usermod -aG docker $USER +set -Eeuo pipefail -#User this to confirm the install was successful -#docker --version -#docker compose version \ No newline at end of file +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" 2>/dev/null && pwd || true)" +LOCAL_INSTALLER="${SCRIPT_DIR}/install-docker.sh" +RAW_INSTALLER_URL="https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh" + +if [[ -n "$SCRIPT_DIR" && -x "$LOCAL_INSTALLER" ]]; then + exec "$LOCAL_INSTALLER" "$@" +fi + +if command -v curl >/dev/null 2>&1; then + curl -fsSL "$RAW_INSTALLER_URL" | bash -s -- "$@" +else + echo "curl is required when running Docker-Install.sh without a local install-docker.sh file." >&2 + exit 1 +fi diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c92dcc --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +# Docker-Install + +A polished one-command Docker installer for fresh Ubuntu/Debian servers. + +It installs: + +- Docker Engine +- Docker CLI +- containerd +- Docker Buildx plugin +- Docker Compose plugin + +It can also optionally add a chosen Linux user to the `docker` group so Docker commands can be run without `sudo` after the user logs out/in. + +## One-command install + +Install Docker only: + +```bash +curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash +``` + +Install Docker and add the current SSH/login user to the docker group: + +```bash +curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash -s -- --current-user +``` + +Install Docker and add a specific user to the docker group: + +```bash +curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash -s -- --user obin +``` + +Non-interactive install without adding a docker user: + +```bash +curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash -s -- --yes +``` + +## Local usage + +```bash +git clone https://gitea.wheelytho.com/Wheelz/Docker-Install.git +cd Docker-Install +chmod +x install-docker.sh +./install-docker.sh --current-user +``` + +The old `Docker-Install.sh` filename still exists as a compatibility wrapper. + +## Options + +```text +--user USER Add USER to the docker group after install. +--current-user Add the invoking SSH/login user to the docker group. +--no-docker-user Do not add anyone to the docker group. +-y, --yes Non-interactive defaults. Skips docker group unless --user/--current-user is supplied. +-h, --help Show help. +``` + +## After adding a user to the docker group + +Group membership does not apply to already-open shells. Log out and back in, or run: + +```bash +newgrp docker +``` + +Then verify Docker works without sudo: + +```bash +docker run --rm hello-world +``` + +## Supported systems + +- Ubuntu +- Debian + +The installer uses Docker's official apt repository for the detected OS and codename. diff --git a/install-docker.sh b/install-docker.sh new file mode 100755 index 0000000..e1575db --- /dev/null +++ b/install-docker.sh @@ -0,0 +1,164 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +SCRIPT_NAME="$(basename "$0")" +DEFAULT_USER="${SUDO_USER:-${USER:-}}" +DOCKER_USER="" +ADD_DOCKER_GROUP="ask" +ASSUME_YES="false" + +usage() { + cat <<'USAGE' +Install Docker Engine and Docker Compose plugin on a fresh Debian/Ubuntu server. + +Usage: + ./install-docker.sh [options] + curl -fsSL /install-docker.sh | bash -s -- [options] + +Options: + --user USER Add USER to the docker group after install. + --current-user Add the invoking user to the docker group. + --no-docker-user Do not add anyone to the docker group. + -y, --yes Non-interactive defaults. Installs Docker and skips docker group unless --user/--current-user is also supplied. + -h, --help Show this help. + +Examples: + curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash + curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash -s -- --user obin + curl -fsSL https://gitea.wheelytho.com/Wheelz/Docker-Install/raw/branch/main/install-docker.sh | bash -s -- --current-user +USAGE +} + +log() { printf '\n[Docker-Install] %s\n' "$*"; } +warn() { printf '\n[Docker-Install WARNING] %s\n' "$*" >&2; } +fail() { printf '\n[Docker-Install ERROR] %s\n' "$*" >&2; exit 1; } + +while [[ $# -gt 0 ]]; do + case "$1" in + --user) + [[ $# -ge 2 ]] || fail "--user requires a username" + DOCKER_USER="$2" + ADD_DOCKER_GROUP="yes" + shift 2 + ;; + --current-user) + [[ -n "$DEFAULT_USER" && "$DEFAULT_USER" != "root" ]] || fail "Could not determine a non-root invoking user. Use --user USER instead." + DOCKER_USER="$DEFAULT_USER" + ADD_DOCKER_GROUP="yes" + shift + ;; + --no-docker-user) + ADD_DOCKER_GROUP="no" + DOCKER_USER="" + shift + ;; + -y|--yes) + ASSUME_YES="true" + [[ "$ADD_DOCKER_GROUP" == "ask" ]] && ADD_DOCKER_GROUP="no" + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + fail "Unknown option: $1. Run with --help for usage." + ;; + esac +done + +if [[ "${EUID}" -ne 0 ]]; then + if command -v sudo >/dev/null 2>&1; then + SUDO="sudo" + else + fail "This installer needs root privileges. Re-run as root or install sudo." + fi +else + SUDO="" +fi + +if [[ ! -r /etc/os-release ]]; then + fail "Cannot read /etc/os-release. This installer supports Debian/Ubuntu style systems." +fi +# shellcheck disable=SC1091 +. /etc/os-release +OS_ID="${ID:-}" +OS_CODENAME="${VERSION_CODENAME:-}" + +case "$OS_ID" in + ubuntu|debian) ;; + *) fail "Unsupported OS '${OS_ID:-unknown}'. This script currently supports Ubuntu and Debian." ;; +esac + +if [[ -z "$OS_CODENAME" ]] && command -v lsb_release >/dev/null 2>&1; then + OS_CODENAME="$(lsb_release -cs)" +fi +[[ -n "$OS_CODENAME" ]] || fail "Could not determine OS codename for Docker apt repo." + +if [[ "$ADD_DOCKER_GROUP" == "ask" ]]; then + if [[ -n "$DEFAULT_USER" && "$DEFAULT_USER" != "root" && -t 0 ]]; then + read -r -p "Add '${DEFAULT_USER}' to the docker group for passwordless docker commands? [y/N]: " reply + case "$reply" in + [Yy]*) ADD_DOCKER_GROUP="yes"; DOCKER_USER="$DEFAULT_USER" ;; + *) ADD_DOCKER_GROUP="no" ;; + esac + else + ADD_DOCKER_GROUP="no" + fi +fi + +if [[ "$ADD_DOCKER_GROUP" == "yes" ]]; then + [[ -n "$DOCKER_USER" ]] || fail "Docker group add requested but no user was selected. Use --user USER." + id "$DOCKER_USER" >/dev/null 2>&1 || fail "User '$DOCKER_USER' does not exist. Create the user first or choose a different username." +fi + +log "Installing prerequisites" +$SUDO apt-get update +$SUDO apt-get install -y ca-certificates curl gnupg + +log "Adding Docker's official apt repository for ${OS_ID} ${OS_CODENAME}" +$SUDO install -m 0755 -d /etc/apt/keyrings +curl -fsSL "https://download.docker.com/linux/${OS_ID}/gpg" | $SUDO gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg +$SUDO chmod a+r /etc/apt/keyrings/docker.gpg + +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${OS_ID} ${OS_CODENAME} stable" \ + | $SUDO tee /etc/apt/sources.list.d/docker.list >/dev/null + +log "Installing Docker Engine and Compose plugin" +$SUDO apt-get update +$SUDO apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + +log "Enabling and starting Docker" +$SUDO systemctl enable --now docker + +if [[ "$ADD_DOCKER_GROUP" == "yes" ]]; then + log "Adding '${DOCKER_USER}' to the docker group" + $SUDO groupadd -f docker + $SUDO usermod -aG docker "$DOCKER_USER" +fi + +log "Verifying install" +$SUDO docker --version +docker compose version || $SUDO docker compose version +$SUDO docker run --rm hello-world >/dev/null + +cat < + newgrp docker +EOF +fi