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.

Вернуться на верх