# Build stage - create dummy packages and clone FlareSolverr FROM --platform=amd64 cloudron/base:5.0.0@sha256:6bec2b5246567ef8b5b13ca0af756e2e596941e440d76b46635211cd84383922 AS build_image # Build dummy packages to skip installing them and their dependencies RUN apt-get update && \ apt-get install -y --no-install-recommends equivs git && \ equivs-control libgl1-mesa-dri && \ printf 'Section: misc\nPriority: optional\nStandards-Version: 3.9.2\nPackage: libgl1-mesa-dri\nVersion: 99.0.0\nDescription: Dummy package for libgl1-mesa-dri\n' >> libgl1-mesa-dri && \ equivs-build libgl1-mesa-dri && \ mv libgl1-mesa-dri_*.deb /libgl1-mesa-dri.deb && \ equivs-control adwaita-icon-theme && \ printf 'Section: misc\nPriority: optional\nStandards-Version: 3.9.2\nPackage: adwaita-icon-theme\nVersion: 99.0.0\nDescription: Dummy package for adwaita-icon-theme\n' >> adwaita-icon-theme && \ equivs-build adwaita-icon-theme && \ mv adwaita-icon-theme_*.deb /adwaita-icon-theme.deb && \ git clone --depth 1 https://github.com/FlareSolverr/FlareSolverr.git /tmp/flaresolverr && \ rm -rf /var/lib/apt/lists/* # Runtime stage FROM --platform=amd64 cloudron/base:5.0.0@sha256:6bec2b5246567ef8b5b13ca0af756e2e596941e440d76b46635211cd84383922 WORKDIR /app/code/flaresolverr # Copy dummy packages from build stage COPY --from=build_image /libgl1-mesa-dri.deb / COPY --from=build_image /adwaita-icon-theme.deb / # Install dummy packages and runtime dependencies RUN dpkg -i /libgl1-mesa-dri.deb && \ dpkg -i /adwaita-icon-theme.deb && \ apt-get update && \ apt-get install -y --no-install-recommends \ wget \ xz-utils \ unzip \ xvfb \ dumb-init \ procps \ curl \ vim \ xauth \ ca-certificates \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libgtk-3-0 \ libgbm1 \ libasound2t64 \ libxss1 \ libxrandr2 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxkbcommon0 \ libxshmfence1 && \ # Download Google Chrome .deb package and extract the binary # Chrome works as a drop-in replacement for Chromium in FlareSolverr wget -q -O /tmp/chrome.deb "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" && \ mkdir -p /tmp/chrome-extract && \ cd /tmp/chrome-extract && \ dpkg-deb -x ../chrome.deb . && \ # Copy entire Chrome installation directory (Chrome needs its resources) mkdir -p /opt/google && \ cp -r opt/google/chrome /opt/google/ && \ # Create symlink to chrome binary ln -sf /opt/google/chrome/chrome /usr/local/bin/chromium && \ # Download chromedriver from Chrome for Testing # Get latest stable version and download matching chromedriver CHROMEDRIVER_VERSION=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_STABLE) && \ wget -q -O /tmp/chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip" && \ unzip -q -o /tmp/chromedriver.zip -d /tmp && \ find /tmp -name "chromedriver" -type f -executable -exec cp {} /usr/local/bin/chromedriver \; && \ chmod +x /usr/local/bin/chromium /usr/local/bin/chromedriver && \ # Create chromium-browser symlink (FlareSolverr looks for chromium-browser) ln -sf /usr/local/bin/chromium /usr/local/bin/chromium-browser && \ ln -sf /usr/local/bin/chromium /usr/bin/chromium && \ ln -sf /usr/local/bin/chromium-browser /usr/bin/chromium-browser && \ # Move chromedriver to app directory (FlareSolverr expects it there) mv /usr/local/bin/chromedriver /app/code/chromedriver && \ chmod +x /app/code/chromedriver && \ # Clean up rm -rf /tmp/chrome* /tmp/chromedriver* /var/lib/apt/lists/* && \ rm -f /usr/lib/x86_64-linux-gnu/libmfxhw* && \ rm -f /usr/lib/x86_64-linux-gnu/mfx/* && \ rm -f /libgl1-mesa-dri.deb /adwaita-icon-theme.deb # Copy FlareSolverr code from build stage COPY --from=build_image /tmp/flaresolverr/src /app/code/flaresolverr COPY --from=build_image /tmp/flaresolverr/requirements.txt /app/code/flaresolverr/ COPY --from=build_image /tmp/flaresolverr/package.json /app/code/flaresolverr/ # Install Python dependencies # Using --break-system-packages is acceptable in a Docker container RUN pip3 install --break-system-packages --no-cache-dir -r /app/code/flaresolverr/requirements.txt && \ rm -rf /root/.cache/pip # Set proper ownership RUN chown -R cloudron:cloudron /app/code/flaresolverr # Copy start script COPY start.sh /app/code/start.sh RUN chmod +x /app/code/start.sh && chown cloudron:cloudron /app/code/start.sh # Set environment variables ENV LANG=en_US.UTF-8 ENV TZ=UTC ENV LOG_LEVEL=info ENV PORT=8191 ENV HOST=0.0.0.0 # Expose port EXPOSE 8191 # Use dumb-init to handle signals properly (avoids zombie chromium processes) ENTRYPOINT ["/usr/bin/dumb-init", "--"] # Run as cloudron user USER cloudron CMD ["/app/code/start.sh"]