web-capture 0.3.13

CLI and microservice to render web pages as HTML, Markdown, or PNG
Documentation
# Build stage
FROM rust:1.94-bullseye AS builder

WORKDIR /app

# Copy Cargo files first for better caching
COPY Cargo.toml Cargo.lock* ./

# Create a dummy main.rs to build dependencies
RUN mkdir src && \
    echo "fn main() {}" > src/main.rs && \
    echo "pub fn dummy() {}" > src/lib.rs

# Build dependencies only
RUN cargo build --release && rm -rf src

# Copy the actual source code
COPY src ./src

# Build the actual application
RUN touch src/main.rs src/lib.rs && cargo build --release

# Runtime stage
FROM debian:bullseye-slim

WORKDIR /app

# Install dependencies for headless Chrome (with retries for transient network errors)
RUN apt-get update && \
    for i in 1 2 3; do \
      apt-get install -y \
        chromium \
        fonts-liberation \
        libasound2 \
        libatk-bridge2.0-0 \
        libatk1.0-0 \
        libatspi2.0-0 \
        libcups2 \
        libdbus-1-3 \
        libdrm2 \
        libgbm1 \
        libgtk-3-0 \
        libnspr4 \
        libnss3 \
        libxcomposite1 \
        libxdamage1 \
        libxfixes3 \
        libxrandr2 \
        libxshmfence1 \
        xdg-utils \
        ca-certificates \
        --no-install-recommends && break || \
      { echo "apt-get install attempt $i failed, retrying..."; sleep 5; }; \
    done && \
    rm -rf /var/lib/apt/lists/*

# Set Chrome/Chromium environment variables
ENV CHROME_PATH=/usr/bin/chromium
ENV CHROMIUM_PATH=/usr/bin/chromium

# Copy the binary from builder
COPY --from=builder /app/target/release/web-capture /usr/local/bin/web-capture

EXPOSE 3000

ENTRYPOINT ["web-capture", "--serve"]