Почему я не могу запустить веб-сайт 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',
    }
}
Вернуться на верх