Проблема запуска и монтирования докеризованного 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