modern-django-starter/entrypoint.sh
Django Template c4a0769185 Comprehensive fix for Docker static files permission issues
## 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>
2025-09-11 16:26:49 +05:30

28 lines
704 B
Bash
Executable File

#!/bin/bash
set -e
echo "Waiting for PostgreSQL..."
sleep 5
echo "Setting up directories and permissions..."
# Create directories and set proper permissions
mkdir -p /app/staticfiles /app/media
chown -R django:django /app/staticfiles /app/media
chmod -R 755 /app/staticfiles /app/media
echo "Running migrations..."
python manage.py migrate --noinput
echo "Creating default groups..."
python manage.py create_groups
echo "Setting up social applications..."
python manage.py setup_social_apps
echo "Collecting static files..."
python manage.py collectstatic --noinput
echo "Switching to django user and starting application..."
# Switch to django user for the main application
exec gosu django "$@"