Почему я не могу запустить веб-сайт Django с помощью docker?
У меня есть веб-приложение Django, и мне нужно запустить его с помощью docker. Я создал два образа: один для Django, другой для postgresql. Они успешно собираются, но во время компиляции возникает проблема django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 or psycopg module
. Похоже, что docker не установил psycopg2 из файла requirements.txt.
Dockerfile:
# Here I'm creating an image for Django.
FROM python:3.10.0-alpine
COPY requirements.txt /requirements.txt
COPY movies_admin /movies_admin
WORKDIR /movies_admin
EXPOSE 8000
RUN apk add postgresql-client build-base postgresql-dev
RUN pip install -r requirements.txt
docker-compose.yml
services:
django:
build:
context: .
ports:
- "8000:8000"
volumes:
- "./movies_admin:/movies_admin"
environment:
- DB_HOST=database
- POSTGRES_DB=movies_database
- POSTGRES_USER=app
- POSTGRES_PASSWORD=123qwe
command:
sh -c "python3 manage.py runserver 0.0.0.0:8000"
depends_on:
- database
database:
image: postgres:16
environment:
- POSTGRES_DB=movies_database
- POSTGRES_USER=app
- POSTGRES_PASSWORD=123qwe
requirements.txt
asgiref==3.8.1
autopep8==2.1.0
black==24.3.0
click==8.1.7
Django==5.0.4
django-split-settings==1.3.1
flake8==7.0.0
mccabe==0.7.0
mypy-extensions==1.0.0
packaging==24.0
pathspec==0.12.1
platformdirs==4.2.0
psycopg2==2.9.9
psycopg2-binary==2.9.9
pycodestyle==2.11.1
pyflakes==3.2.0
python-dotenv==1.0.1
sqlparse==0.4.4
tomli==2.0.1
typing_extensions==4.11.0
Я предлагаю перестроить вашу Dockerfile
следующим образом:
FROM python:3.10.0-alpine
RUN apk add postgresql-client build-base postgresql-dev
WORKDIR /movies_admin
COPY requirements.txt .
RUN pip install -r requirements.txt
EXPOSE 8000
COPY movies_admin .
Почему это работает? Файл requirements.txt
копируется в рабочий каталог, после чего пакеты немедленно устанавливаются. Это гарантирует, что вы получите правильные пакеты! В примере Dockerfile
из вопроса файл requirements.txt
копируется в корневой каталог /requirements.txt
. Но затем вы меняете рабочий каталог на /movies_admin
, так что при запуске pip install -r requirements.txt
он пытается использовать файл в /movies_admin
, а не тот, который вы скопировали в /requirements.txt
.
При этом предполагается, что макет вашего проекта выглядит примерно так:
├── docker-compose.yml
├── Dockerfile
├── movies_admin
│ ├── db.sqlite3
│ ├── manage.py
│ └── movies_admin
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── requirements.txt
🚨 Файл requirements.txt
находится в том же каталоге, что и docker-compose.yml
и Dockerfile
.
Чтобы завершить эту настройку, вам нужно убедиться, что ваша база данных правильно настроена в вашем Django settings.py
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'movies_database',
'USER': 'app',
'PASSWORD': '123qwe',
'HOST': 'database',
'PORT': '5432',
}
}