Fix apt-ostree container installation failure
Some checks failed
Comprehensive CI/CD Pipeline / Build and Test (push) Successful in 16m26s
Comprehensive CI/CD Pipeline / Security Audit (push) Failing after 7s
Comprehensive CI/CD Pipeline / Package Validation (push) Successful in 53s
Comprehensive CI/CD Pipeline / Status Report (push) Has been skipped

- Enhanced check_systemd() function to properly detect container environments
- Added detection for Docker, Podman, and other container runtimes
- Verify systemd is running as PID 1 before attempting service operations
- Check systemd D-Bus availability before service configuration
- Gracefully skip systemd setup in containers with helpful messages
- Provide manual configuration instructions for real systems

Fixes container builds and CI/CD pipelines that install apt-ostree
while maintaining full functionality on real systems with systemd.
This commit is contained in:
robojerk 2025-09-08 12:06:23 -07:00
parent 2306ee2a72
commit 2e4acff6de
2 changed files with 181 additions and 17 deletions

View file

@ -36,25 +36,79 @@ check_systemd() {
return 1
fi
# Check if we're in a container environment
if [ -f /.dockerenv ] || [ -n "${container:-}" ] || [ -f /run/.containerenv ] || \
([ -f /proc/1/cgroup ] && grep -q docker /proc/1/cgroup 2>/dev/null); then
log "Warning: Running in container environment, skipping systemd service setup"
# Enhanced container environment detection
local in_container=false
# Check for Docker container indicators
if [ -f /.dockerenv ]; then
log "Detected Docker container environment"
in_container=true
fi
# Check for Podman container indicators
if [ -f /run/.containerenv ]; then
log "Detected Podman container environment"
in_container=true
fi
# Check for container environment variable
if [ -n "${container:-}" ]; then
log "Detected container environment (container=${container})"
in_container=true
fi
# Check cgroup for container indicators
if [ -f /proc/1/cgroup ]; then
if grep -qE "(docker|podman|containerd|kubepods)" /proc/1/cgroup 2>/dev/null; then
log "Detected container environment via cgroup"
in_container=true
fi
fi
# Check for systemd-nspawn container
if [ -f /run/systemd/container ]; then
local container_type
container_type=$(cat /run/systemd/container 2>/dev/null || echo "")
if [ -n "$container_type" ]; then
log "Detected systemd-nspawn container (type: $container_type)"
in_container=true
fi
fi
# Check for LXC container
if [ -f /proc/1/environ ] && grep -q "container=lxc" /proc/1/environ 2>/dev/null; then
log "Detected LXC container environment"
in_container=true
fi
# If in container, skip systemd setup
if [ "$in_container" = true ]; then
log "Running in container environment, skipping systemd service setup"
log "Container environments typically don't run systemd as PID 1"
return 1
fi
# Check if systemd is actually running as PID 1
if ! ps -p 1 -o comm= | grep -q systemd; then
log "Warning: systemd not running as PID 1, skipping service setup"
local init_process
init_process=$(ps -p 1 -o comm= 2>/dev/null || echo "")
if [ "$init_process" != "systemd" ]; then
log "Warning: systemd not running as PID 1 (init process: ${init_process:-unknown}), skipping service setup"
return 1
fi
# Check if systemd D-Bus is available
# Check if systemd D-Bus is available and responsive
if ! systemctl is-system-running >/dev/null 2>&1; then
log "Warning: systemd not running, skipping service setup"
log "Warning: systemd D-Bus not available or not running, skipping service setup"
return 1
fi
# Additional check: verify we can actually communicate with systemd
if ! systemctl list-units --type=service >/dev/null 2>&1; then
log "Warning: Cannot communicate with systemd, skipping service setup"
return 1
fi
log "Systemd environment verified, proceeding with service setup"
return 0
}
@ -62,34 +116,57 @@ check_systemd() {
setup_service() {
if ! check_systemd; then
log "Skipping systemd service configuration"
log "To configure services manually on a real system, run:"
log " systemctl enable apt-ostreed.service"
log " systemctl start apt-ostreed.service"
log ""
log "=== Manual Configuration Instructions ==="
log "To configure apt-ostreed service on a real system with systemd:"
log " 1. Enable the service: systemctl enable apt-ostreed.service"
log " 2. Start the service: systemctl start apt-ostreed.service"
log " 3. Check status: systemctl status apt-ostreed.service"
log ""
log "For container environments:"
log " - apt-ostreed service is not needed in containers"
log " - Use 'apt-ostree' commands directly as needed"
log " - Service will be available when running on real systems"
log ""
return 0
fi
log "Setting up apt-ostreed service..."
# Reload systemd daemon
systemctl daemon-reload
# Reload systemd daemon to pick up new service files
if systemctl daemon-reload; then
log "Systemd daemon reloaded successfully"
else
log "Warning: Failed to reload systemd daemon"
return 1
fi
# Enable the service
if systemctl enable apt-ostreed.service; then
log "apt-ostreed service enabled"
log "apt-ostreed service enabled successfully"
else
log "Warning: Failed to enable apt-ostreed service"
log "Error: Failed to enable apt-ostreed service"
return 1
fi
# Start the service if not running
if ! systemctl is-active --quiet apt-ostreed.service; then
if systemctl start apt-ostreed.service; then
log "apt-ostreed service started"
log "apt-ostreed service started successfully"
else
log "Warning: Failed to start apt-ostreed service"
log "Warning: Failed to start apt-ostreed service (may need manual intervention)"
log "Try running: systemctl status apt-ostreed.service"
fi
else
log "apt-ostreed service already running"
fi
# Verify service is working
if systemctl is-active --quiet apt-ostreed.service; then
log "apt-ostreed service is active and running"
else
log "Warning: apt-ostreed service is not active"
fi
}
# Function to setup directories and permissions