Nginx и Gunicorn Статические файлы не найдены в моем проекте docker-compose django, даже если журналы показывают '125 статических файлов скопировано в '/app/static''.
Я настроил папку nginx, DOckerfile, .env, файлы docker-compose.yml и entrypoint.sh, и все работает нормально, и я могу видеть страницы, как это должно быть. Но единственная проблема заключается в том, что я не могу загрузить статические файлы. Журналы контейнера Gunicorn показывают "Not Found", а контейнер nginx показывает ошибку (2: No such file or directory).
Вот мои конфигурационные файлы:
docker-compose.yml
version: '3'
services:
marathon_gunicorn:
volumes:
- static:/static
env_file:
- .env
build:
context: .
ports:
- "8010:8000"
nginx:
build: ./nginx
volumes:
- static:/static
ports:
- "8012:80"
depends_on:
- marathon_gunicorn
db:
image: postgres:15
container_name: postgres_db
restart: always
environment:
POSTGRES_DB: xxx
POSTGRES_USER: xxx
POSTGRES_PASSWORD: xxx
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
static:
pg_data:`
entrypoint.sh
#!/bin/sh
# Apply database migrations
python manage.py migrate --no-input
# Collect static files
python manage.py collectstatic --no-input
# Start Gunicorn server
gunicorn absamarathon.wsgi:application --bind 0.0.0.0:8000
# Django Dockerfile
FROM python:3.8
RUN pip install --upgrade pip Скопируйте файл ./requirements.txt . RUN pip install -r requirements.txt
COPY ./absamarathon /app
WORKDIR /app
COPY ./entrypoint.sh / ENTRYPOINT ["sh", "/entrypoint.sh" ]``
nginx/default.conf
upstream django {
server marathon_gunicorn:8000;
}
server {
listen 80;
location / {
proxy_pass http://django;
}
location /static/ {
alias /static/;
}
# location /media/ {
# alias /app/media/;
# }
}
settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
Ваша конфигурация ngix неправильна, так как она не обрабатывает статику правильно, потому что вы не указали nginx, где находится папка для сервера /static. Вы должны поместить /static/
над /
, чтобы он совпадал с первым.
server {
listen 80;
location /static/ {
alias /app/static/;
}
location / {
proxy_pass http://django;
}
}
Создайте и присоедините том к контейнеру,
docker-compose.yml
volumes:
static_files:
name: static_files
nginx:
build: ./nginx
volumes:
- static:/static
ports:
- "8012:80"
depends_on:
- marathon_gunicorn
volumes:
- static_files:/app/static:ro
Конфигурация Nginx выглядит нормально, но отображение виртуальных томов для контейнера Django нарушено.
В докерном образе Django вы определили
COPY ./absamarathon /app
Таким образом, ваш проект BASE_DIR
находится в папке /app
. В настройках проекта Django вы определили
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
таким образом, местоположение статических файлов - /app/static
.
Но в конфигурации docker-compose вы сопоставляете виртуальный том static
с папкой контейнера /static
вместо /app/static
.
Для контейнера marathon_gunicorn
измените отображение тома на
static:/app/static
Не меняйте его для контейнера Nginx. Также вам может быть полезно ознакомиться с этим ответом на SO.