Я создаю приложение 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».
привет, в статической папке внутри обоих контейнеров их нет
хотя папка "создается"
я имел в виду, вы видели какие-либо файлы в статической папке?
я не видел никаких файлов в статической папке, я ssh в каталоги контейнера и списка, ничего не напечатано
Попробуйте добавить следующую команду в Dockerfile и пересобрать образ.
RUN python manage.py collectstatic --noinput
Вы можете разместить его после RUN pip install --no-cache-dir -r requirements.txt
статика создается в контейнере, но не может отражаться в томе (мой локальный)
Вы используете именованный том 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)
вы видите какие-либо файлы в статической папке?