Проблема запуска и монтирования докеризованного Django + Nginx

Я хочу создать окружение для моего личного проекта hovewer, но никак не могу решить эту проблему.

У меня все работало, я сделал некоторые реорганизации в структуре проекта, чтобы структурировать его так, как я хочу (или думаю, что это лучше) и сломал его, пытаясь исправить это :/ И, честно говоря, у меня была похожая проблема в прошлом, я боролся с ней ... я думаю, я ничего не узнал и забыл, как я это исправил (не был докеризован).

Проект представляет собой просто базовую конфигурацию по умолчанию, чтобы он работал так, как я хочу, так что у меня есть удобство развертывания CI/CD jenkins и я могу запускать и играть через контейнеры docker.

Я расскажу о соответствующих частях, а также о структуре проекта.

Структура файла проекта:

RaC/
├── django/
│   ├── Dockerfile
│   ├── .env
│   ├── manage.py
│   ├── files/
│   │   ├── media/
│   │   └── static/
│   └── rac_backend/
│       ├── __init__.py
│       ├── asgi.py
│       ├── requirements.txt
│       ├── settings.py
│       ├── urls.py
│       ├── wsgi.py
├── jenkins/
├── nginx/
├── postgres/
├── redis/
├── templates/
├── venv/
├── manage.py
└── docker-compose.yml

docker-compose.yml

version: '3.8'

services:
  jenkins:
    build:
      context: ./jenkins
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins_data:/var/jenkins_home

  rac_backend:
    build:
      context: .
      dockerfile: django/Dockerfile
    volumes:
      - .:/code
      - ./django/files/static:/code/static
      - ./django/files/media:/code/media
    expose:
      - 8000
    env_file:
      - django/rac_backend/.env
    depends_on:
      - db
      - redis

  nginx:
    image: nginx:alpine
    volumes:
      - static_volume:/usr/share/nginx/html/static
      - media_volume:/usr/share/nginx/html/media
      - ./nginx:/etc/nginx/conf.d
    ports:
      - "80:80"
    depends_on:
      - rac_backend

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data

volumes:
  jenkins_data:
  static_volume:
  media_volume:
  postgres_data:
  redis_data:

django/Dockerfile

FROM python:3.9

WORKDIR /code

COPY django/ .

RUN pip install --no-cache-dir -r requirements.txt

# Set environment variable to ensure Python outputs are sent straight to terminal without being first buffered
ENV PYTHONUNBUFFERED 1

CMD ["gunicorn", "rac_backend.asgi:application", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

setting.py

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = '/static/'
MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(BASE_DIR, '../files/static')
MEDIA_ROOT = os.path.join(BASE_DIR, '../files/media')
...

По сути, мои пути перепутаны, и Django не запускается, потому что я получаю ошибку ModuleNotFoundError: No module named 'rac_backend', которая является результатом CMD, запущенного Dockerfile, поскольку он не может найти модуль rac_backend.

Ошибка:

rac_backend-1  | ModuleNotFoundError: No module named 'rac_backend'
rac_backend-1  | [2024-03-20 21:01:24 +0000] [7] [INFO] Worker exiting (pid: 7)
rac_backend-1  | [2024-03-20 21:01:24 +0000] [1] [ERROR] Worker (pid:7) exited with code 3
rac_backend-1  | [2024-03-20 21:01:24 +0000] [1] [ERROR] Shutting down: Master
rac_backend-1  | [2024-03-20 21:01:24 +0000] [1] [ERROR] Reason: Worker failed to boot.

Также после выполнения docker-compose up я вижу, что внутри директории RaC/, которая является корнем проекта, создаются 2 пустые директории media/ и static/. Я хочу обслуживать эти файлы из Rac/django/files/*.

Сегодня в качестве отчаянной меры я потратил полдня на то, чтобы сломать chatGPT4 :/ ... Пожалуйста, помогите

Надеюсь, понятно, чего я пытаюсь добиться. Запускаю приложение django с nginx, работающим в docker с jenkins для ci/cd pipeline. И посмотрите, как изменилась страница установки Django по умолчанию, когда я зафиксировал первую домашнюю страницу Hello World на http://localhost

Проблема заключается в том, чтобы структура каталогов в вашем Dockerfile соответствовала монтированию томов в вашем docker-compose.yml. Вот урезанная версия проекта, которая работает. Вы можете добавить другие службы, как только добьетесь, чтобы это работало.

├── django
│   ├── Dockerfile
│   ├── manage.py
│   ├── rac_backend
│   │   ├── asgi.py
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── requirements.txt
└── docker-compose.yml

🗎 docker-compose.yml (Обратите внимание на то, как указан volumes для согласованности с расположением каталогов, заданным в Dockerfile.)

version: '3.8'

services:
  rac_backend:
    build:
      context: .
      dockerfile: django/Dockerfile
    volumes:
      - ./django/:/code
    expose:
      - 8000

🗎 Dockerfile

FROM python:3.9

ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY django/ .

RUN ls

RUN pip install --no-cache-dir -r requirements.txt

CMD ["gunicorn", "rac_backend.asgi:application", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

🗎 requirements.txt (Скорее всего, здесь указаны другие версии.)

gunicorn==21.2.0
uvicorn==0.29.0
Django==4.2.11

enter image description here

Вернуться на верх