Nginx не видит статические файлы при запуске с помощью docker compose +gunicorn
Дело в том, что я настроил dockerfiles, docker-compose все работает как надо. Базы данных подключены и весь персонал. Но единственная проблема в том, что я не могу загрузить staticfiles. Gunicorn сообщает, что файлы "Не найдены" как admin, так и статические файлы rest_framework. Когда я делаю "docker-compose up", он говорит, что `0 статических файлов были скопированы в '/static', 165 немодифицированных
На данный момент я проверил пути, которые настроены в STATIC_ROOT и STATIC URL. Также я изменил файл docker-compose:
version: '3.11'
services:
django_gunicorn:
volumes:
- static:/static/
env_file:
- .env
build:
context: .
ports:
- "8000:8000"
nginx:
build: ./nginx
volumes:
- static:/static/
ports:
- "80:80"
depends_on:
- django_gunicorn
- db
db:
image: postgres
expose:
- 5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
static:
Также я проверил конфигурационный файл nginx еще раз:
upstream django {
server django_gunicorn:8000;
}
server {
listen 80;
location / {
proxy_pass http://django;
}
location /static/ {
autoindex on;
alias /static/;
}
}
Я также пробовал разные подходы к настройке root и url staticfiles, но пока оставил так:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
Также были предложения сначала запустить "collectstatic", что я уже сделал, но никакого эффекта, поэтому я пока удалил папку static, потому что я не видел папку static и в других приложениях.
точка входа/sh
#!/bin/sh
python manage.py migrate --no-input
python manage.py collectstatic --no-input
gunicorn config.wsgi:application --bind 0.0.0.0:8000
Nginx должен сопоставить STATIC_URL с STATIC_ROOT с учетом сопоставления томов в docker-compose.
docker-compose отображение тома для Nginx:
- static:/static/
виртуальный том "static" в корневой каталог /static/
Nginx location
location /static/ {
autoindex on;
alias /static/;
}
Сопоставляет STATIC_URL = /static/
с каталогом внутри контейнера nginx /static/
, который соответствует docker-compose volume mapping, о котором мы только что говорили. Расположение должно соответствовать STATIC_URL
, потому что Django генерирует эти URL и использует STATIC_URL, поэтому URL статических файлов будут начинаться с STATIC_URL, и чтобы поймать эти URL, nginx должен использовать то же расположение. Но значение алиаса не должно совпадать с STATIC_ROOT, потому что мы "доставляем" статические файлы в nginx через отображение виртуального тома в docker-compose и они (статические файлы) появятся для nginx именно там, где мы им скажем - - static:/static/
- nginx container увидит их по /static/
пути. Настройки Django не влияют на этот путь.
проект Django образ docker
COPY ./backend /app
что означает, что BASE_DIR
внутри контейнера будет /app
и это именно то, что collectstatic
сообщает вам: '165 static files copied to '/app/static'
Теперь нам нужно поделиться этими файлами с nginx через виртуальный том, отобразив виртуальный том на каталог внутри контейнера проекта django с собранными статическими файлами. Статические файлы были собраны в каталог /app/static
. Виртуальный том, совместно используемый с nginx - static
, поэтому
docker-compose отображение тома для проекта Django
- static:/app/static/