Как можно исправить ошибку "database «db» does not exist" при сборке докер-контейнера?

Как можно исправить ошибку "asyncpg.exceptions.InvalidCatalogNameError: database 'db' does not exist", возникающую при сборке приложения с использованием Docker, PostgreSQL и Redis? В моем docker-compose файле определены сервисы для PostgreSQL, Redis и моего приложения, который зависит от этих двух сервисов, и я использую переменные среды для настройки соединения с базой данных PostgreSQL. При запуске docker-compose up --build возникает ошибка о том, что база данных не существует. Я попробовал сбросить кэш с помощью команды docker system prune -a, но проблема осталась.
  • 23 января 2024 г. 18:13
Ответы на вопрос 2
Ошибка "database 'db' does not exist", указывает на то, что приложение пытается обратиться к базе данных, которая ещё не создана в Postgres. Вот несколько шагов, чтобы устранить эту проблему:

1. Проверьте определение сервиса Postgres в вашем `docker-compose.yml`. Убедитесь, что переменные среды указывают на верные значения имени базы данных, пользователя и пароля, например:

```yaml
services:
  postgres:
    image: postgres:latest
    environment:
      POSTGRES_DB: your_db_name  # Замените your_db_name на имя вашей базы данных
      POSTGRES_USER: your_user    # ваше имя пользователя
      POSTGRES_PASSWORD: your_password # и ваш пароль
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis

  app:
    build: .
    depends_on:
      - postgres
      - redis
    environment:
      DATABASE_URL: postgresql://your_user:your_password@postgres/your_db_name # Убедитесь что URL соответствует данным выше

volumes:
  postgres_data:
```

2. Проверьте, что ваше приложение дожидается полного запуска зависимых сервисов, включая базу данных Postgres, перед началом работы со своим кодом. В случае с Postgres, его инициализация может занять некоторое время, особенно при первом запуске, когда создаются пользователь и база данных.

3. Удостоверьтесь, что скрипты миграции базы данных запускаются корректно. Если вы используете систему миграций, он должен применить все необходимые изменения в базу перед началом работы приложения.

4. Попробуйте подключиться к вашему Postgres контейнеру напрямую через командную строку или использовать GUI инструмент типа pgAdmin для проверки, что база данных действительно создана.

```bash
docker exec -it <container_id_or_name> psql -U your_user -d your_db_name
```

5. Проверьте, что ваше приложение использует переменные среды правильно, и что они не перепутаны с локальными переменными окружения на вашей машине.

6. Если вы недавно изменили конфигурации и имя базы данных, убедитесь, что вы пересобрали образы и перезапустили контейнеры, чтобы изменения вступили в силу.

```bash
docker-compose down
docker-compose up --build
```

Наконец, если вы всё же используете `docker system prune -a` для сброса кэша, учтите, что это удалит все неиспользуемые образы, контейнеры, сети и тома, что может быть не то что вы ожидали. Эта операция необходима обычно в случаях, когда вы хотите освободить место на диске, а не для решения проблем конфигурации сервисов.
Потому что базы данных db не существует. По умолчанию создается бд postgres . 
Тут 3 решения:
- Создать БД db при старте приложения
- Использовать скрипт инициализации - все *.sql файлы внутри директории /docker-entrypoint-initdb.d/ выполняются при инициализации БД
- Указывать название БД по умолчанию через переменную окружения POSTGRES_DB: 'db'
Похожие вопросы