# Base stage FROM ocaml/opam:debian-12-ocaml-5.2 as base WORKDIR /home/opam/website_monitor # Install system dependencies RUN sudo apt-get update && sudo apt-get install -y \ pkg-config \ libssl-dev \ libgmp-dev \ libev-dev \ libpq-dev \ ca-certificates \ m4 \ postgresql-client \ wget \ && sudo rm -rf /var/lib/apt/lists/* # Copy project files COPY --chown=opam:opam dune-project ./ COPY --chown=opam:opam website_monitor.opam ./ # Install dependencies RUN opam install . --deps-only --with-test # Build stage (CPU constrained) FROM base as build ENV OPAMJOBS=1 ENV OCAMLPARAM=_,_threadsafe # Copy source code COPY --chown=opam:opam . . # Build with CPU constraint RUN opam exec -- dune build --root . --profile release # Runtime stage FROM debian:12-slim as runtime WORKDIR /app # Install runtime dependencies RUN apt-get update && apt-get install -y \ libssl3 \ ca-certificates \ tzdata \ wget \ && rm -rf /var/lib/apt/lists/* # Copy binaries from build stage COPY --from=build /home/opam/website_monitor/_build/default/bin/main.exe /app/website_monitor COPY --from=build /home/opam/website_monitor/_build/default/bin/init_db.exe /app/website_monitor_init_db # Copy entrypoint script COPY --chown=monitor:monitor docker-entrypoint.sh /app/docker-entrypoint.sh RUN chmod +x /app/docker-entrypoint.sh # Create non-root user RUN useradd -m -u 1000 monitor && chown -R monitor:monitor /app USER monitor # Expose port EXPOSE 8080 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1 # Run application ENTRYPOINT ["/app/docker-entrypoint.sh"] CMD []