From 47a8d0201e9a6186b5b8447705587a7f5f901ad1 Mon Sep 17 00:00:00 2001 From: jafreli Date: Sat, 21 Mar 2026 23:05:53 +0100 Subject: [PATCH] refactor: Optimize Docker build with a multi-stage process and switch docker-compose to use a pre-built image. --- Dockerfile | 34 ++++++++++++++++++++++------------ docker-compose.yml | 2 +- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index a432dfd..0bc23d8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,35 @@ -FROM python:3.12-slim AS base +# --- Build stage --- +FROM python:3.12-slim AS builder -# Install uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ WORKDIR /app -# Copy dependency files first for better layer caching +# Enable bytecode compilation for faster startup +ENV UV_COMPILE_BYTECODE=1 +# Use copy mode (no hardlinks in containers) +ENV UV_LINK_MODE=copy + +# Install dependencies first (cached if pyproject.toml unchanged) COPY pyproject.toml uv.lock* ./ +RUN uv sync --no-dev --no-install-project --frozen -# Install dependencies -RUN uv sync --no-dev --no-install-project - -# Copy source code +# Copy source and install project COPY src/ ./src/ +RUN uv sync --no-dev --frozen -# Install the project itself -RUN uv sync --no-dev +# --- Runtime stage --- +FROM python:3.12-slim -# Create data directory -RUN mkdir -p /app/data +WORKDIR /app +# Copy the entire venv and project from builder +COPY --from=builder /app /app + +# Add venv to PATH so we don't need uv at runtime +ENV PATH="/app/.venv/bin:$PATH" ENV DATA_DIR=/app/data -CMD ["uv", "run", "python", "-m", "src.main"] +RUN mkdir -p /app/data + +CMD ["rss-bot"] diff --git a/docker-compose.yml b/docker-compose.yml index 1f991b1..d149918 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: rss-bot: - build: . + image: git.out.jafre.li/jafreli/updater:latest container_name: rss-discord-bot restart: unless-stopped env_file: