django 使用docker compose +gunicorn启动时,nginx看不到静态文件

1l5u6lss  于 2023-02-10  发布在  Go
关注(0)|答案(1)|浏览(141)

问题是我已经设置了dockerfiles,docker-compose正在运行一切,因为它应该是。数据库是连接和所有的工作人员。但唯一的问题是,我不能加载静态文件。Gunicorn通知,该文件"找不到"管理,和rest_framework静态文件。即使它创建'静态'在根目录,但不收集静态那里,而dockerfile运行。
当我做"docker-compose up"时,它说"0个静态文件被复制到"/static",165个未修改
到目前为止,我已经检查了在STATIC_ROOT和STATIC URL中配置的路径。另外,修改了我的docker-compose文件:

version: '3.11'

services:
  django_gunicorn:
    volumes:
      - static:/static/
    env_file:
      - .env
    build:
      context: .
    ports:
      - "8000:8000"
  nginx:
    build: ./nginx
    volumes:
      - ./backend/service/static:/backend/static
    ports:
      - "80:80"
    depends_on:
      - django_gunicorn
      - db
  db:
    image: postgres
    expose:
      - 5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
volumes:
  static:

此外,我已经检查了nginx配置文件一次:

upstream django {
    server django_gunicorn:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://django;
    }
    location /static/ {
        autoindex on;
        alias /static/;
    }
}

我也尝试过不同的方法来设置staticfiles的根目录和url,但现在还是这样:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

也有人建议先运行"collectstatic",我已经这样做了,但没有效果,所以我现在删除了静态文件夹,因为我没有看到其他应用程序中的"静态"文件夹以及。
进入点/sh

#!/bin/sh

python manage.py migrate --no-input
python manage.py collectstatic --no-input

gunicorn config.wsgi:application --bind 0.0.0.0:8000

下面是我的Dockerfile:

FROM python:3.11

RUN pip install --upgrade pip

COPY ./requirements.txt .
RUN pip install -r requirements.txt \
    python manage.py collectstatic \
    pip install python-dotenv
COPY ./backend /app

WORKDIR /app

COPY ./entrypoint.sh /
ENTRYPOINT ["sh", "/entrypoint.sh"]
2jcobegt

2jcobegt1#

Nginx必须将STATIC_URLMap到STATIC_ROOT,这与docker-compose中的卷Map有关。

Nginx停靠合成卷Map:

- static:/static/
虚拟卷“静态”到根目录/static/

Nginx位置

location /static/ {
    autoindex on;
    alias /static/;
}

将STATIC_URL = /static/Map到nginx容器/static/内的目录,该目录与我们刚才提到的docker-compose卷Map相匹配。位置应该与STATIC_URL匹配,因为Django生成这些URL,并且它确实使用STATIC_URL,因此静态文件的URL将以STATIC_URL开始,并且为了捕获这些URL,nginx必须使用相同的位置。但别名值不应该与STATIC_ROOT,因为我们通过docker-compose中的虚拟卷Map将静态文件“交付”到nginx,并且它们(静态文件)会出现在我们告诉它们的地方-- static:/static/- nginx container 会在/static/路径下看到它们。Django设置不会影响这个路径。

Django项目Docker图像

COPY ./backend /app
这意味着BASE_DIR * 在容器内 * 将是/app,这正是collectstatic向您报告的内容:x1米11米1x
现在我们需要通过虚拟卷将这些文件与nginx共享,方法是将虚拟卷Map到django项目容器内的目录,其中包含收集的静态文件。静态文件被收集到/app/static。与nginx共享的虚拟卷是static,因此

docker-compose用于Django项目的卷Map

- static:/app/static/

相关问题