Какая может быть причина ошибки при подключении к PostgreSQL в Docker с использованием библиотеки psycopg2 в Python?

Здравствуйте! Я использую библиотеку psycopg2 внутри контейнера Docker, где также установлен Postgres. При старте базы данных она создается, но возникает ошибка при подключении через Python: <br/> <pre><code>app-1    | [INFO] Error while working with PostgreSQL connection to server at "db_auth" (172.18.0.3), port 5432 failed: FATAL:  password authentication failed for user "admin"</code></pre> <br/> Затем следует еще одно сообщение об ошибке: <br/> <pre><code>app-1    | 
app-1    | Traceback (most recent call last):
app-1    |   File "/app/main.py", line 24, in &lt;module&gt;
app-1    |     if connection: # Завершение работы базы данных
app-1    |        ^^^^^^^^^^
app-1    | NameError: name 'connection' is not defined
app-1 exited with code 1</code></pre> <br/> Вот код функции main: <br/> <pre><code class="python">import psycopg2
from config import host, user, password, db_name, port
import time

time.sleep(10)
try:
  connection = psycopg2.connect(
    host=host,
    user=user,
    password=password,
    database=db_name,
    port=port
  )
  
  with connection.cursor() as cursor:
    cursor.execute(
      "SELECT version();"
    )
    print(cursor.fetchone())
  
except Exception as _ex:
  print("[INFO] Error while working with PostgreSQL", _ex)
finally:
  if connection: # Завершение работы базы данных
    connection.close()
    print("Завершение работы базы данных")</code></pre> <br/> Вот содержимое файла config: <br/> <pre><code class="python">host = "db_auth"
password = "root"
user = "admin"
port = 5432
db_name = "postgres"</code></pre> <br/> А также файл docker-compose.yml: <br/> <pre><code>services:
  app:
    build: ./app


  db_auth:
    container_name: db_auth
    ports:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRE
  • 3 декабря 2024 г. 9:33
Ответы на вопрос 3
Судя по описанным вами ошибкам и конфигурации, проблема заключается в аутентификации пользователя `admin` в PostgreSQL. Давайте рассмотрим возможные причины и решения.

### Причины ошибки

1. **Неверные учетные данные**: Убедитесь, что пользователь `admin` действительно существует в базе данных PostgreSQL и имеет правильный пароль (`root`). Ваша переменная `password` в файле `config` установлена в `root`, что выглядит правильно.

2. **Пользователь не создан**: В Docker контейнере, если вы не создали пользователя `admin`, он не будет существовать, и попытка аутентификации будет терпеть неудачу. По умолчанию PostgreSQL создает только пользователя `postgres` с паролем, заданным через переменную окружения `POSTGRES_PASSWORD`.

3. **Неправильные настройки PostgreSQL**: Проверьте, что настройки аутентификации в файле `pg_hba.conf` корректны и позволяют пользователю `admin` подключаться к базе данных.

4. **Состояние базы данных**: Убедитесь, что база данных `postgres` действительно доступна и сервер PostgreSQL работает.

5. **Проблемы с сетью**: Убедитесь, что Docker-контейнер `app` может достичь контейнера `db_auth` по имени сервиса `db_auth`.

### Решения

1. **Создание пользователя**: Если вы хотите использовать пользователя `admin`, вам нужно добавить шаг в конфигурацию базы данных при инициализации контейнера. В вашем `docker-compose.yml` вы можете добавить переменную среды `POSTGRES_USER` для создания пользователя:
   ```yaml
   environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_USER=admin
   ```
   При этом вы также можете создать базу данных по умолчанию:
   ```yaml
      - POSTGRES_DB=your_database_name
   ```

2. **Использование существующего пользователя**: Измените код подключения, чтобы использовать пользователя `postgres` вместо `admin`, если вы не нуждаетесь в создании отдельного пользователя:
   ```python
   user = "postgres"
   ```

3. **Проверка подключения**: Убедитесь, что ваш Docker контейнер `app` ожидает завершения инициализации базы данных. Возможно, стоит увеличить время ожидания из-за времени, необходимого для создания пользователя и базы данных.

### Пример обновленного файла docker-compose.yml:

```yaml
version: '3.8'

services:
  db_auth:
    container_name: db_auth
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=postgres

  app:
    build: ./app
    depends_on:
      - db_auth
    environment:
      - DATABASE_URL=postgresql://admin:root@db_auth:5432/postgres
```

Попробуйте внести изменения, перезапустив контейнеры с помощью `docker-compose down` и затем `docker-compose up --build`. Это должно помочь с вашей проблемой.
1. ты текст ошибки пробовал перевести? 
2.
А потом еще: NameError: name 'connection' is not defined
а это говорит про проблему твоих базовых знаний python
У вас неправильный пароль. Введите правильный пароль и все ошибки уйдут. 
Ну и это
finally:
  if connection: # Завершение работы базы данных
    connection.close()
    print("Завершение работы базы данных")
замените на это
else:
  if connection: # Завершение работы базы данных
    connection.close()
    print("Завершение работы базы данных")

Так как блок finally выполняется в любом случае, а else только если не возникло исключения.
Похожие вопросы