Дело в том, что я настроил 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 просто показывает журналы. также, если я удалю статическую папку - она создаст ее сама и вернет «165 статических файлов, скопированных в «/ app / static». У меня нет папки /app/, поэтому я думаю, что это в контейнере докеров. И статическая папка, которая была создана, все еще пуста Итак, где эта папка /app/ существует? как это использовать
Отвечает ли это на ваш вопрос? как заставить статические файлы работать с помощью django docker nginx и postgresql, поскольку он их не обслуживает
Нет, я обновлю свой код здесь с этим исправлением. Я уже пробовал это, но ничего не помогает.
покажи свой докерфайл django
Я добавил файл докер
COPY ./backend /app
вот откуда взялась папка app
. Ваш проект находится в папке app
, а static
находится под этой BASE_DIR
, поэтому вы видите /app/static
в collectstatic
выводе. То же, что и OP в теме, я дал ссылку, чтобы все было в папке /backend
, у вас есть все в папке /app
, и ни его, ни ваша конфигурация не учитывают это. Обе проблемы похожи. Взгляните на этот поток и сделайте файлы конфигурации соответствующими структуре папок.
./backend/service/static:/backend/static
это теряет сопоставление с виртуальным томом static:
и указывает на несуществующий /backend/static
, тогда как ваши статические файлы находятся в /app/static
насколько я понимаю, /app/ существует в контейнере докеров, а не в корне проекта. backend/static существует в моем проекте, и я понятия не имею, где найти app/static/ и использовать его.
Большое спасибо за Вашу помощь. проверю еще раз, более внимательно.
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/
со всей любовью и уважением, мой друг! Большое спасибо, за ваши усилия и помощь!
Gunicorn informs
ганикорн не должен знать о таких запросах. Возможно, Nginx не использует показанную конфигурацию. Пожалуйста, добавьте пример статического URL-адреса файла, который не может быть разрешен, и покажите свой файл докеров nginx (возможно, перестройте образ, перезапустите контейнер заранее, чтобы убедиться, что используется фактическая конфигурация).