Support rootless Podman builds
This commit is contained in:
8 files changed
+198
-78
No files matched your search
@@ -15,6 +15,7 @@ set -e
|
||||
|
||||
BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..")
|
||||
source "$BUILD_ROOT/helpers/message-helpers.sh"
|
||||
source "$BUILD_ROOT/helpers/docker-helpers.sh"
|
||||
source "$BUILD_ROOT/helpers/paths.sh"
|
||||
|
||||
CHECK_ONLY=false
|
||||
@@ -62,10 +63,12 @@ if command -v apt-get >/dev/null 2>&1; then
|
||||
DISTRO="debian"
|
||||
PKG_BSDTAR="libarchive-tools"
|
||||
PKG_DOCKER="docker.io"
|
||||
PKG_PODMAN="podman"
|
||||
elif command -v pacman >/dev/null 2>&1; then
|
||||
DISTRO="arch"
|
||||
PKG_BSDTAR="libarchive"
|
||||
PKG_DOCKER="docker"
|
||||
PKG_PODMAN="podman"
|
||||
else
|
||||
print_error "Unsupported distribution — need apt-get or pacman"
|
||||
exit 1
|
||||
@@ -73,18 +76,36 @@ fi
|
||||
|
||||
print_info "Distribution: $DISTRO"
|
||||
|
||||
# A fresh repository host still defaults to Docker. An explicit Podman choice,
|
||||
# or a working Podman selected by the shared helper, is left alone.
|
||||
if [[ -z "$CONTAINER_ENGINE" ]]; then
|
||||
CONTAINER_ENGINE=docker
|
||||
export CONTAINER_ENGINE
|
||||
fi
|
||||
if ! container_engine_supported; then
|
||||
print_error "Unsupported CONTAINER_ENGINE: $CONTAINER_ENGINE (use docker or podman)"
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$CONTAINER_ENGINE" == "docker" ]]; then
|
||||
PKG_ENGINE="$PKG_DOCKER"
|
||||
ENGINE_NAME="Docker"
|
||||
else
|
||||
PKG_ENGINE="$PKG_PODMAN"
|
||||
ENGINE_NAME="Podman"
|
||||
fi
|
||||
|
||||
if [[ "$CHECK_ONLY" != true && $EUID -ne 0 ]]; then
|
||||
print_error "Run as root (installing packages and systemd units)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Docker and the release timers are both systemd units. Say so plainly rather
|
||||
# than failing later on a missing command — a container is the usual way to end
|
||||
# up here, and it cannot be a repository host.
|
||||
# The release timers are systemd units. Say so plainly rather than failing
|
||||
# later on a missing command — a container is the usual way to end up here,
|
||||
# and it cannot be a repository host.
|
||||
if [[ "$CHECK_ONLY" != true ]] && ! command -v systemctl >/dev/null 2>&1; then
|
||||
print_error "systemctl not found — the repository host must run systemd"
|
||||
echo ""
|
||||
echo "Docker and the release timers are systemd units. This looks like a"
|
||||
echo "The release timers are systemd units. This looks like a"
|
||||
echo "container; run setup on the host itself."
|
||||
exit 1
|
||||
fi
|
||||
@@ -140,24 +161,27 @@ else
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# --- docker ------------------------------------------------------------------
|
||||
# --- container engine --------------------------------------------------------
|
||||
|
||||
# Docker is left alone when it already works. A host may well be running a
|
||||
# The selected engine is left alone when it already works. A host may be running a
|
||||
# version from Docker's own repository rather than the distribution's, and
|
||||
# replacing that underneath a working builder would be a poor trade for
|
||||
# tidiness.
|
||||
print_info "Checking Docker..."
|
||||
print_info "Checking $ENGINE_NAME..."
|
||||
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
print_step "docker present: $(docker --version 2>/dev/null | head -1)"
|
||||
if docker info >/dev/null 2>&1; then
|
||||
print_success "Docker is installed and running — leaving it alone"
|
||||
if command -v "$CONTAINER_ENGINE" >/dev/null 2>&1; then
|
||||
print_step "$CONTAINER_ENGINE present: $("$CONTAINER_ENGINE" --version 2>/dev/null | head -1)"
|
||||
if "$CONTAINER_ENGINE" info >/dev/null 2>&1; then
|
||||
print_success "$ENGINE_NAME is installed and available — leaving it alone"
|
||||
elif [[ "$CHECK_ONLY" == true ]]; then
|
||||
print_warning "Docker is installed but not running; would start it"
|
||||
print_warning "$ENGINE_NAME is installed but unavailable"
|
||||
elif [[ "$CONTAINER_ENGINE" == "podman" ]]; then
|
||||
print_error "Podman is installed but unavailable to the current user"
|
||||
exit 1
|
||||
else
|
||||
print_info "Docker is installed but not running — starting it"
|
||||
systemctl enable --now docker.service
|
||||
if docker info >/dev/null 2>&1; then
|
||||
if "$CONTAINER_ENGINE" info >/dev/null 2>&1; then
|
||||
print_success "Docker started"
|
||||
else
|
||||
print_error "Docker is installed but still not responding"
|
||||
@@ -166,16 +190,24 @@ if command -v docker >/dev/null 2>&1; then
|
||||
fi
|
||||
fi
|
||||
elif [[ "$CHECK_ONLY" == true ]]; then
|
||||
print_warning "Would install $PKG_DOCKER and enable it"
|
||||
else
|
||||
print_info "Installing $PKG_DOCKER..."
|
||||
install_packages "$PKG_DOCKER"
|
||||
systemctl enable --now docker.service
|
||||
if docker info >/dev/null 2>&1; then
|
||||
print_success "Docker installed and running"
|
||||
if [[ "$CONTAINER_ENGINE" == "docker" ]]; then
|
||||
print_warning "Would install $PKG_ENGINE and enable it"
|
||||
else
|
||||
print_error "Docker installed but not responding"
|
||||
echo " Check 'systemctl status docker' — builds cannot run without it."
|
||||
print_warning "Would install $PKG_ENGINE"
|
||||
fi
|
||||
else
|
||||
print_info "Installing $PKG_ENGINE..."
|
||||
install_packages "$PKG_ENGINE"
|
||||
if [[ "$CONTAINER_ENGINE" == "docker" ]]; then
|
||||
systemctl enable --now docker.service
|
||||
fi
|
||||
if "$CONTAINER_ENGINE" info >/dev/null 2>&1; then
|
||||
print_success "$ENGINE_NAME installed and available"
|
||||
else
|
||||
print_error "$ENGINE_NAME installed but not responding"
|
||||
if [[ "$CONTAINER_ENGINE" == "docker" ]]; then
|
||||
echo " Check 'systemctl status docker' — builds cannot run without it."
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
Reference in new issue
Block a user