From e722cbe31156b1af6c6089f93d067a4c810ba27e Mon Sep 17 00:00:00 2001 From: saani Date: Sun, 23 Nov 2025 19:12:27 +0000 Subject: [PATCH] refactor(docker): replace uv with pip and move Django commands to runtime Replace uv package manager with standard pip for dependency management. Switch base image from debian:bookworm-slim to python:3.12-slim to include Python runtime by default. Key changes: - Remove uv installation and configuration - Use requirements.txt instead of pyproject.toml/uv.lock - Install dependencies with pip instead of uv sync - Move collectstatic and migrate from build-time to runtime in CMD - Simplify gunicorn command invocation This simplifies the build process and makes the image more portable by using standard Python tooling. Running migrations and collectstatic at container startup ensures they execute against the correct database and storage backend. --- dockerfile | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/dockerfile b/dockerfile index 82fddd4..7d57a80 100644 --- a/dockerfile +++ b/dockerfile @@ -1,37 +1,32 @@ -FROM debian:bookworm-slim +FROM python:3.12-slim -# Set environment variables -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 +# Environment settings +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 # Set work directory WORKDIR /app +# System dependencies RUN apt-get update && apt-get install -y \ build-essential \ curl wget \ && rm -rf /var/lib/apt/lists/* -RUN curl -LsSf https://astral.sh/uv/install.sh | sh -ENV PATH="/root/.local/bin:${PATH}" +# Copy dependency file +COPY requirements.txt . -# Copy only the dependency definitions first to leverage Docker's layer caching -COPY pyproject.toml uv.lock .python-version ./ +# Install Python dependencies +RUN pip install --no-cache-dir -r requirements.txt -# Install Python dependencies for production -RUN uv sync --no-group dev --group prod - -# Copy the rest of the application code into the container +# Copy project files COPY . . -# Collect the static files -RUN uv run --no-sync ./manage.py collectstatic --noinput - -# Migrate the database -RUN uv run --no-sync ./manage.py migrate - -# Expose the port Gunicorn will run on +# Expose port EXPOSE 8000 -# Run with gunicorn -CMD ["uv", "run", "--no-sync", "gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "--access-logfile", "-", "--error-logfile", "-", "--log-level", "info", "config.wsgi:application"] \ No newline at end of file +# Run migrations + collectstatic + gunicorn at runtime +CMD \ + python manage.py migrate && \ + python manage.py collectstatic --noinput && \ + gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 -- 2.39.5