Невозможно обслуживать статические файлы django через nginx и docker

У меня проблема с настройкой сервера nginx с помощью docker и django. Вот моя структура каталогов

-nginx
--default.conf
--Dockerfile
-portfolio_app (django webpapp)
--main_app
---settings.py
---wsgi.py
--sub_app
---views.py
---static
---media
-docker-compose.yml
-Dockerfile (django related)
-entrypoint.sh (to start django server)

Что касается django, то он работает, но я не могу обслуживать статические файлы. Мне кажется, я неправильно указываю путь.

Здесь находится Dockerfile, связанный с django

FROM python:3.8.13-slim-buster

WORKDIR /app
RUN pip install --upgrade pip
COPY ./requirements.txt ./
RUN pip install -r requirements.txt

COPY ./portfolio_app ./

COPY ./entrypoint.sh ./
ENTRYPOINT ["sh","/app/entrypoint.sh"]

nginx файлы
default.conf

upstream django{
    server portfolio_app:8000;
}

server {
    listen 80;

    location /{
        proxy_pass http://django;
    }

    location /static/ {
        alias sub_app/static/;
    }

}

Dockerfile

FROM nginx:1.19.0-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

Вот файл docker-compose.yml

version: '3.3'
services:
  portfolio_app:
    build: .
    container_name: portfolio_app
    volumes:
      - static_volume:/sub_app/static
      - media_volume:/sub_app/media
    ports:
      - "8000:8000"
    env_file:
      - .env

  nginx:
    build: ./nginx
    volumes:
      - static_volume:/sub_app/static
      - media_volume:/sub_app/media
    ports:
      - "80:80"
    depends_on:
      - portfolio_app


volumes:
  media_volume:
  static_volume:

Я не уверен в пути к томам в yml файле и настройках default.conf. Вот журналы

Successfully built 8459b7bb3baf
Successfully tagged docker_nginx:latest
Recreating b0f1b634454f_portfolio_app ... done
Recreating docker_nginx_1             ... done
Attaching to portfolio_app, docker_nginx_1
nginx_1          | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx_1          | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx_1          | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
portfolio_app    | [2022-07-21 08:09:47 +0000] [7] [INFO] Starting gunicorn 20.1.0
nginx_1          | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
portfolio_app    | [2022-07-21 08:09:47 +0000] [7] [INFO] Listening at: http://0.0.0.0:8000 (7)
portfolio_app    | [2022-07-21 08:09:47 +0000] [7] [INFO] Using worker: sync
nginx_1          | 10-listen-on-ipv6-by-default.sh: /etc/nginx/conf.d/default.conf differs from the packages version, exiting
portfolio_app    | [2022-07-21 08:09:47 +0000] [9] [INFO] Booting worker with pid: 9
nginx_1          | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx_1          | /docker-entrypoint.sh: Configuration complete; ready for start up
portfolio_app    | Not Found: /static/lib/animate/animate.min.css

Редактировать Вот как я добавил статические url и файл в settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'sub_app','media') 
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'sub_app','static')

default.conf:

вместо этого:

location /static/ {
        alias sub_app/static/;
    }

попробуйте это:

location /static/ {
        alias ./static/;
    }

В вашей службе nginx вы смонтировали том, как показано ниже. Где static_volume - том хоста, а /app/sub_app/static - каталог контейнера, куда он смонтирован.

static_volume:/app/sub_app/static

Но в конфигурационном файле nginx вы направляете статические запросы на /static_volume/. Вместо этого вам нужно указать его на каталог вашего контейнера, как показано ниже

location /static/ {
        alias /app/sub_app/static/;
    }
Вернуться на верх