Статические файлы Django не найдены внутри контейнера докеров

Я создаю приложение Django с Docker. Я запускаю команду collectstatic в своей точке входа, когда база данных готова. Когда я проверяю свой контейнер, папка /static/ пуста. Таким образом, Nginx не может загружать статические файлы.

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = '/static/'

Вот мой файл для создания докеров

version: "3.9"

services:
  db:
    image: postgis/postgis:14-3.3
    container_name: db
    volumes:
      - ./data/db:/var/lib/postgresql/data
    env_file:
    - prod.env

  backend:
    container_name: backend
    build:
      dockerfile: ./django/Dockerfile
    command: gunicorn api.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static:/usr/src/app/static
    ports:
      - "8000:8000"
    env_file:
    - prod.env
    depends_on:
      - db
  
  nginx:
    container_name: nginx
    build:
      dockerfile: ./nginx/Dockerfile
    volumes:
      - static:/usr/src/app/static
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: always

  redis:
    container_name: redis
    restart: unless-stopped
    image: redis:alpine 
    expose:
      - 6379

  worker:
    container_name: worker
    build:
      dockerfile: ./django/Dockerfile
    command: celery -A api worker -l INFO
    volumes:
      - static:/usr/src/app/static
    env_file:
    - prod.env
    depends_on:
      - db
      - backend
      - redis
  
volumes:
  static:

Моя конфигурация Nginx:

upstream api {
    server backend:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://api;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /usr/src/app/static/;
    }
}

бэкэнд Dockerfile:

# syntax=docker/dockerfile:1
FROM python:3
WORKDIR /usr/src/app
RUN apt-get update
RUN apt-get install -y libgdal-dev gdal-bin netcat

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY /django/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY /django/django-entrypoint.sh /django-entrypoint.sh
RUN chmod +x /django-entrypoint.sh

COPY django /usr/src/app

ENTRYPOINT ["/django-entrypoint.sh"]

И точка входа:

#!/bin/sh

if [ "$POSTGRES_NAME" = "postgres" ]
then
    echo "Waiting for Postgres..."

    while ! nc -z $POSTGRES_HOST $POSTGRES_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

ls
# python manage.py flush --no-input
python manage.py migrate --no-input
python manage.py collectstatic --no-input

exec "$@"

В моих файлах (локальных) я не вижу создаваемой папки «/static/». Как это? Я проверил, что статика в backend и nginx по ssh в контейнере, и статические папки были пусты. В логах collectstatic выполнялся без ошибки с таким сообщением:

бэкэнд | 173 статических файла скопированы в «/static».

вы видите какие-либо файлы в статической папке?

ruddra 01.02.2023 11:14

привет, в статической папке внутри обоих контейнеров их нет

Nikko 01.02.2023 11:27

хотя папка "создается"

Nikko 01.02.2023 11:27

я имел в виду, вы видели какие-либо файлы в статической папке?

ruddra 01.02.2023 11:32

я не видел никаких файлов в статической папке, я ssh в каталоги контейнера и списка, ничего не напечатано

Nikko 01.02.2023 11:34
Стоит ли изучать 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
5
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте добавить следующую команду в Dockerfile и пересобрать образ.

RUN python manage.py collectstatic --noinput

Вы можете разместить его после RUN pip install --no-cache-dir -r requirements.txt

статика создается в контейнере, но не может отражаться в томе (мой локальный)

Nikko 01.02.2023 11:50
Ответ принят как подходящий

Вы используете именованный том Docker для хранения статических файлов.

    volumes:
      - static:/usr/src/app/static
      # ^^^^^^
      #   a volume name, not a host path

Этот именованный том существует только внутри хранилища Docker; вы не увидите его содержимое в своей хост-системе или в локальном исходном дереве.

Это не проблема для настройки, которую вы описываете здесь: поскольку вы перезапускаете collectstatic каждый раз, когда запускается контейнер, а содержимое тома скрывает содержимое изображения в этом каталоге, нет особой необходимости в файлах. существуют в системе управления версиями или в файловой системе вашего хоста. Если бы они вам действительно понадобились, вы могли бы запустить manage.py collectstatic в виртуальной среде, отличной от Docker.

Привет, Дэвид, когда я подключаюсь к контейнерам по ssh, создается статическая папка, но папка пуста. Следовательно, nginx не может видеть файлы. "/usr/src/app/static/admin/css/nav_sidebar.css" failed (2: No such file or directory)

Nikko 01.02.2023 13:22

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