From e5aee5be8257287ab4c04eb94f1e27ae29625781 Mon Sep 17 00:00:00 2001 From: Alex Hope-O'Connor Date: Wed, 10 Dec 2025 10:46:10 +1000 Subject: [PATCH] Add Xvfb monitoring and restart functionality - Move startup script to scripts/docker-start.sh for better organization - Add automatic monitoring and restart of Xvfb if it crashes - Improve error handling and cleanup on container shutdown - Prevents cache update failures when Xvfb process dies --- Dockerfile | 9 +++----- scripts/docker-start.sh | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 scripts/docker-start.sh diff --git a/Dockerfile b/Dockerfile index 37df569..e32d2c3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,12 +34,9 @@ COPY --from=publish /app/publish . # Create cache directory for screenshots RUN mkdir -p /app/cache && chmod 777 /app/cache -# Create startup script to run Xvfb and then the app -RUN echo '#!/bin/bash\n\ -Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 &\n\ -export DISPLAY=:99\n\ -exec dotnet BomLocalService.dll' > /app/start.sh && \ - chmod +x /app/start.sh +# Copy startup script +COPY scripts/docker-start.sh /app/start.sh +RUN chmod +x /app/start.sh # OCI labels for GitHub Container Registry metadata LABEL org.opencontainers.image.source="https://github.com/alexhopeoconnor/bom-local-service" diff --git a/scripts/docker-start.sh b/scripts/docker-start.sh new file mode 100644 index 0000000..4324c86 --- /dev/null +++ b/scripts/docker-start.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +# Function to start Xvfb +start_xvfb() { + if ! pgrep -f "Xvfb :99" > /dev/null; then + echo "Starting Xvfb on display :99..." + Xvfb :99 -screen 0 1920x1080x24 -ac +extension GLX +render -noreset > /dev/null 2>&1 & + sleep 1 + if ! pgrep -f "Xvfb :99" > /dev/null; then + echo "ERROR: Xvfb failed to start" >&2 + return 1 + fi + echo "Xvfb started successfully" + fi + return 0 +} + +# Function to monitor and restart Xvfb if it dies (runs as background process) +monitor_xvfb() { + # Monitor while PID 1 (dotnet after exec) is still running + while kill -0 1 2>/dev/null; do + sleep 5 + if ! pgrep -f "Xvfb :99" > /dev/null; then + echo "WARNING: Xvfb process not found, restarting..." >&2 + start_xvfb || true + fi + done +} + +# Cleanup function +cleanup() { + echo "Shutting down Xvfb..." + pkill -f "Xvfb :99" || true +} + +# Set up signal handlers for cleanup +trap cleanup SIGTERM SIGINT EXIT + +# Start Xvfb +start_xvfb || exit 1 + +# Export DISPLAY +export DISPLAY=:99 + +# Start monitoring in background (will check if PID 1 is still running) +monitor_xvfb & + +# Start the .NET application (replaces shell as PID 1) +exec dotnet BomLocalService.dll