Ошибка 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')