Докеризованный проект Django не обслуживает файлы после попытки настроить статическую конфигурацию
Я запускаю докеризованное веб-приложение с использованием Django. У меня возникли проблемы с тем, чтобы заставить статические файлы работать (я не мог заставить приложение найти их), я думал, что разобрался с этим, что файлы имеют неправильные разрешения, и добавил к ним мою текущую группу пользователей. После этого приложение не запускается.
Что значит "не запускается"?
Теперь я получаю сообщения OOM от Gunicorn, которых не было до тех пор, пока я не изменил права на корневую папку static. Пока что это не очень интенсивное приложение, что заставляет меня сомневаться в том, что это проблема с памятью.
[2024-08-30 19:08:12 +0000] [1] [INFO] Starting gunicorn 23.0.0
[2024-08-30 19:08:12 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2024-08-30 19:08:12 +0000] [1] [INFO] Using worker: sync
[2024-08-30 19:08:12 +0000] [7] [INFO] Booting worker with pid: 7
[2024-08-30 19:08:52 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:7)
[2024-08-30 19:08:53 +0000] [1] [ERROR] Worker (pid:7) was sent SIGKILL! Perhaps out of memory?
[2024-08-30 19:08:53 +0000] [8] [INFO] Booting worker with pid: 8
Мне кажется, что изменение разрешений вызвало некоторые проблемы. Вот текущая настройка разрешений:
-rw-rw-r-- 1 ash ash 757 Aug 30 20:17 docker-compose.yml
-rw-rw-r-- 1 ash ash 965 Aug 26 18:02 Dockerfile
drwxrwxr-x 7 ash ash 4096 Aug 26 18:32 gs-python
drwxr-xr-x 3 ash ash 4096 Aug 16 20:12 nginx
-rw-rw-r-- 1 ash ash 6 Aug 15 17:16 README.md
-rw-rw-r-- 1 ash ash 31 Aug 15 19:06 requirements.txt
drwxrwxrwx 2 ash ash 4096 Aug 30 19:50 static
docker-compose.yml
version: '3.8'
services:
web:
build: .
command: gunicorn app-name.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./gs-python:/app
- ./gs-python/static:/app/static # Directly mount local static folder
expose:
- "8000"
depends_on:
- db
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB:
POSTGRES_USER:
POSTGRES_PASSWORD:
nginx:
image: nginx:latest
volumes:
- ./static:/app/static
- ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8001:80"
depends_on:
- web
volumes:
postgres_data:
Dockerfile
# Step 1: Use an official Python runtime as a parent image
FROM python:3.9-slim
# Step 2: Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Step 3: Set up working directory
WORKDIR /app
# Step 4: Install system dependencies
RUN apt-get update && apt-get install -y \
python3-dev \
libpq-dev \
postgresql-client \
build-essential \
nginx \
curl \
&& rm -rf /var/lib/apt/lists/*
# Step 5: Install Python dependencies
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Step 6: Copy project files
COPY . /app/
# Step 7: Set up database
# RUN python manage.py makemigrations
# RUN python manage.py migrate
# Step 8: Collect static files
RUN python gs-python/manage.py collectstatic --noinput
# Step 9: Gunicorn command to run the app
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app-name.wsgi:application"]
nginx default.conf
server {
listen 80;
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /app/static/;
autoindex on;
}
}
Я добавил изображение структуры Dir. У меня 2 статические папки, я не уверен, когда произошло это образование, скорее всего, во время моих попыток настроить его.
Удалось решить эту проблему. Я проверил контейнер Gunicorn и почему-то загрузил всю директорию проекта через эту строку:
volumes:
- ./gs-python:/app
Удаление этого и применение некоторых миграций, похоже, решило мою проблему.