Nginx не видит статические файлы, при запуске с docker compose +gunicorn

Дело в том, что я настроил dockerfiles, docker-compose все работает как надо. К БД подключен и весь штат. Но единственная проблема в том, что я не могу загрузить статические файлы. Gunicorn сообщает, что файлы "Not Found" как admin, так и статические файлы rest_framework. Несмотря на то, что он создает «статику» в корневом каталоге, но не собирает ее там во время выполнения dockerfile.

Когда я делаю «docker-compose up», он говорит, что «0 статических файлов были скопированы в «/ static», 165 неизмененных

До сих пор я проверял пути, настроенные в STATIC_ROOT и STATIC URL. Кроме того, изменен мой файл компоновки докеров:

version: '3.11'

services:
  django_gunicorn:
    volumes:
      - static:/static/
    env_file:
      - .env
    build:
      context: .
    ports:
      - "8000:8000"
  nginx:
    build: ./nginx
    volumes:
      - ./backend/service/static:/backend/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/;
    }
}

Я также пробовал разные подходы к настройке корня и URL-адреса статических файлов, но пока оставил это так:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

Также были предложения сначала запустить «collectstatic», что я уже сделал, но безрезультатно, поэтому я пока удалил статическую папку, потому что я не видел «статическую» папку в других приложениях.

точка входа/ш

#!/bin/sh

python manage.py migrate --no-input
python manage.py collectstatic --no-input

gunicorn config.wsgi:application --bind 0.0.0.0:8000

Вот мой Dockerfile:

FROM python:3.11

RUN pip install --upgrade pip

COPY ./requirements.txt .
RUN pip install -r requirements.txt \
    python manage.py collectstatic \
    pip install python-dotenv
COPY ./backend /app

WORKDIR /app

COPY ./entrypoint.sh /
ENTRYPOINT ["sh", "/entrypoint.sh"]
Gunicorn informs ганикорн не должен знать о таких запросах. Возможно, Nginx не использует показанную конфигурацию. Пожалуйста, добавьте пример статического URL-адреса файла, который не может быть разрешен, и покажите свой файл докеров nginx (возможно, перестройте образ, перезапустите контейнер заранее, чтобы убедиться, что используется фактическая конфигурация).
Ivan Starostin 06.02.2023 21:15

я думаю, что gunicorn просто показывает журналы. также, если я удалю статическую папку - она ​​создаст ее сама и вернет «165 статических файлов, скопированных в «/ app / static». У меня нет папки /app/, поэтому я думаю, что это в контейнере докеров. И статическая папка, которая была создана, все еще пуста Итак, где эта папка /app/ существует? как это использовать

Saba Guzitashvili 06.02.2023 21:46

Нет, я обновлю свой код здесь с этим исправлением. Я уже пробовал это, но ничего не помогает.

Saba Guzitashvili 07.02.2023 23:21

покажи свой докерфайл django

Ivan Starostin 08.02.2023 08:03

Я добавил файл докер

Saba Guzitashvili 08.02.2023 09:51
COPY ./backend /app вот откуда взялась папка app. Ваш проект находится в папке app, а static находится под этой BASE_DIR, поэтому вы видите /app/static в collectstatic выводе. То же, что и OP в теме, я дал ссылку, чтобы все было в папке /backend, у вас есть все в папке /app, и ни его, ни ваша конфигурация не учитывают это. Обе проблемы похожи. Взгляните на этот поток и сделайте файлы конфигурации соответствующими структуре папок.
Ivan Starostin 08.02.2023 10:42
./backend/service/static:/backend/static это теряет сопоставление с виртуальным томом static: и указывает на несуществующий /backend/static, тогда как ваши статические файлы находятся в /app/static
Ivan Starostin 08.02.2023 10:43

насколько я понимаю, /app/ существует в контейнере докеров, а не в корне проекта. backend/static существует в моем проекте, и я понятия не имею, где найти app/static/ и использовать его.

Saba Guzitashvili 08.02.2023 10:45

Большое спасибо за Вашу помощь. проверю еще раз, более внимательно.

Saba Guzitashvili 08.02.2023 10:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Nginx должен сопоставлять STATIC_URL со STATIC_ROOT относительно сопоставления томов в docker-compose.

сопоставление томов с компоновкой docker для Nginx:

- static:/static/

виртуальный том «статический» в корневой каталог /static/

Расположение Nginx

location /static/ {
    autoindex on;
    alias /static/;
}

Сопоставляет STATIC_URL = /static/ с каталогом внутри контейнера nginx /static/, который соответствует только что упомянутому сопоставлению томов с созданием докеров. Предполагается, что местоположение соответствует STATIC_URL, потому что Django генерирует эти URL-адреса и использует STATIC_URL, поэтому URL-адреса статических файлов будут начинаться со STATIC_URL, и для перехвата этих URL-адресов nginx должен использовать то же местоположение. Но значение псевдонима не должно совпадать со STATIC_ROOT, потому что мы «доставляем» статические файлы в nginx через сопоставление виртуального тома в docker-compose, и они (статические файлы) будут отображаться для nginx именно там, где мы им скажем — - static:/static/ — контейнер nginx их увидит. под /static/ путем. Настройки Django не влияют на этот путь.

Образ докера проекта Django

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/

со всей любовью и уважением, мой друг! Большое спасибо, за ваши усилия и помощь!

Saba Guzitashvili 08.02.2023 11:14

Другие вопросы по теме