mirror of
https://github.com/thecyberlearn/modern-django-starter.git
synced 2026-08-18 09:52:56 +00:00
## Problem Analysis: - Static files collection failing with permission errors in Docker containers - Non-root user cannot create directories in container filesystem - Previous fix didn't handle runtime permission management properly ## Comprehensive Solution: ### 1. Enhanced Dockerfile: - Added `gosu` package for secure user switching - Removed premature USER directive - run setup as root first - Improved directory permissions with proper chmod/chown ### 2. Robust Entrypoint Script: - Runs initial setup (migrations, static collection) as root - Explicitly sets directory permissions for static/media files - Uses `gosu` to securely switch to django user for main application - Ensures proper ownership before application starts ### 3. Updated Docker Compose Volume: - Changed volume mapping to use ../files/staticfiles (more descriptive) - Ensures persistent storage for static files across deployments ## Security & Best Practices: - ✅ Maintains security with non-root application runtime - ✅ Handles setup operations with necessary root permissions - ✅ Uses gosu for secure user switching (better than su/sudo) - ✅ Explicit permission management for container directories ## Benefits: - Resolves all static files permission errors - Works reliably in containerized environments - Maintains security best practices - Compatible with Dokploy and other orchestration platforms This should completely resolve the collectstatic permission issues. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
53 lines
1.3 KiB
Docker
53 lines
1.3 KiB
Docker
FROM python:3.11-slim as base
|
|
|
|
ENV PYTHONDONTWRITEBYTECODE=1
|
|
ENV PYTHONUNBUFFERED=1
|
|
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends \
|
|
postgresql-client \
|
|
build-essential \
|
|
libpq-dev \
|
|
gettext \
|
|
curl \
|
|
gosu \
|
|
&& curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
|
|
&& apt-get install -y nodejs \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
COPY requirements/base.txt /app/requirements/
|
|
RUN pip install --no-cache-dir -r requirements/base.txt
|
|
|
|
FROM base as development
|
|
|
|
COPY requirements/development.txt /app/requirements/
|
|
RUN pip install --no-cache-dir -r requirements/development.txt
|
|
|
|
COPY . /app/
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
|
|
|
|
FROM base as production
|
|
|
|
COPY requirements/production.txt /app/requirements/
|
|
RUN pip install --no-cache-dir -r requirements/production.txt
|
|
|
|
RUN groupadd -r django && useradd -r -g django django
|
|
|
|
COPY . /app/
|
|
|
|
# Create directories that need write permissions
|
|
RUN mkdir -p /app/staticfiles /app/media && \
|
|
chmod -R 755 /app/staticfiles /app/media && \
|
|
chown -R django:django /app
|
|
|
|
# Don't switch to django user yet - let entrypoint handle permissions
|
|
# USER django
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "django_project.wsgi:application"] |