Ошибка 404 при доступе к ресурсам Django STATIC внутри образа Docker

Это Dockerfile для моего проекта Django:

FROM python:3.10.5-alpine

ENV PYTHONDONTWRITEBYTECODEBYDEFAULT=1
ENV PYTHONUNBUFFERED=1

RUN adduser --disabled-password appuser

USER appuser

WORKDIR /home/appuser/app

COPY requirements.txt .

USER root

RUN python -m pip install --no-cache-dir --disable-pip-version-check --requirement requirements.txt

USER appuser

COPY . .

ENTRYPOINT [ "./entrypoint.sh" ]

Настройки Django относительно статических активов:

STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'static/'

И entrypoint.sh

#!/bin/sh

python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --no-input
gunicorn project.wsgi:application --bind=0.0.0.0:8000 --workers=4 --timeout=300 --log-level=debug --log-file=-

exec "$@"

Когда я запускаю контейнер, я вхожу в него и вижу, что static папка создана и заполнена сотрудниками администратора.

Однако при просмотре http://127.0.0.1:8000/admin появляется страница входа в систему администратора без какого-либо CSS, и я получаю множество 404 ошибок в консоли разработчика.

Я также изменил STATIC_ROOT на /home/appuser/app/static/ и получил то же самое.

Пожалуйста, помогите.

Проверяли ли вы разрешения созданной статической папки?

Мне пришлось вручную изменить права доступа к папкам.

Вы можете попробовать использовать следующий Dockerfile для nginx:

FROM nginx:latest

RUN apt-get update && apt-get install -y procps
RUN mkdir -p /home/app/staticfiles
RUN chmod -R 755 /home/app/staticfiles

Попробуйте использовать этот конфиг.

Django:

STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

Dockerfile:

RUN mkdir -p /home/appuser/app/staticfiles

Nginx.conf

location /static/ {
    alias /home/appuser/app/staticfiles/;
}

docker-compouse.yml что-то вроде:

web:
container_name: test_table_django
build: .
command:
  sh -c "python manage.py collectstatic --no-input --clear &&
    python manage.py migrate &&
    gunicorn --workers=4 --bind=0.0.0.0:8000 test_table.wsgi:application"
volumes:
    - .:/home/appuser/app
    - static_volume:/home/appuser/app/staticfiles/
env_file:
  - .env.prod
expose:
  - 8000
depends_on:
  - db
restart: always

nginx:
    build: ./nginx
    container_name: test_table_nginx
    ports:
      - 80:80
    volumes:
      - static_volume:/home/appuser/app/staticfiles/

Статический URL должен начинаться с /. Вы также можете проверить журналы, чтобы увидеть, куда он пытается попасть.

BASE_DIR = Path(__file__).resolve().parent.parent.parent

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, '..', 'static')
Вернуться на верх