nginx 在Docker容器中找不到Django静态文件

hjzp0vay  于 2023-02-03  发布在  Nginx
关注(0)|答案(2)|浏览(248)

我正在用Docker构建一个Django应用程序。当数据库准备好时,我在入口点运行命令collectstatic。当我检查我的容器时,/static/文件夹是空的。因此,Nginx无法加载静态文件。

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

这是我的docker-compose文件

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/;
    }
}

后端停靠文件:

# 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/"文件夹。这是怎么回事?我已经通过ssh在容器中检查了backendnginx中的static,并且static文件夹为空。在日志中,collectstatic执行时没有出现错误,并显示以下消息:
后端|将173个静态文件复制到"/static "。

ccrfmcuu

ccrfmcuu1#

使用Docker named volume保存静态文件

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

此命名卷仅存在于Docker的存储中;您将无法在主机系统或本地源树中看到其内容。
对于您在此描述的设置,这不是问题:由于每次容器启动时都要重新运行collectstatic,并且卷内容隐藏了该目录中的映像内容,因此这些文件不必存在于源代码控制或主机文件系统中,如果确实需要,可以在非Docker虚拟环境中运行manage.py collectstatic

jutyujz0

jutyujz02#

尝试在Dockerfile中添加以下命令并重新构建映像。

RUN python manage.py collectstatic --noinput

您可以将其放置在RUN pip install --no-cache-dir -r requirements.txt之后

相关问题