Произошло исключение: OperationalError не удалось преобразовать имя хоста «db» в адрес: Неизвестный хост

#python #django #postgresql #docker #docker-compose

#python #django #postgresql #docker #docker-compose

Вопрос:

Я запускаю этот скрипт локально. При подключении к postgres я сталкиваюсь с «Произошло исключение: OperationalError не удалось перевести имя хоста «db» по адресу: неизвестный хост». База данных запущена, я запустил ее с

 docker run --publish 8000:8000 --detach --name db REMOTEURL:latest
 

Когда я делаю то же самое, используя docker-compose и exec в приложение django и запускаю его как команду управления, это работает. Код:

 conn_string = "host='db' dbname='taras' user='postgres' password='postgres'"
with psycopg2.connect(conn_string) as connection:
    with connection.cursor() as cursor:
    ... my stuff
 

Я не знаю, почему при доступе к контейнеру docker из локального скрипта на моем компьютере имя docker (url) никогда не распознается. Также попробовал «localhost» вместо «db». При запуске скрипта python внутри контейнера docker у него нет проблем с распознаванием другого контейнера docker (db в моем случае). Чего мне не хватает?

РЕДАКТИРОВАТЬ: просто чтобы уточнить, я использую только базу данных в docker. Скрипт Python запускается локально, используя в моей командной строке Windows

 python myscript.py
 

Docker-создать файл:

 version: "2"
services:
  db:
    image: REMOTEURL:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_HOST_AUTH_METHOD: trust
 

Ответ №1:

Вероятно, это происходит потому, что при запуске контейнеров они могут разрешать имена хостов на основе имен, которые вы им даете внутри, но если вы хотите получить доступ к контейнеру извне (я предполагаю, что вы хотите получить доступ к своей базе данных postgres), вам также необходимо открыть порт для контейнера postgres, добавив -p 5432:5432 в свой контейнер postgres. Если вы хотите получить доступ к postgres из другого контейнера в той же сети, подключитесь с db:5432 помощью , а извне с помощью localhost:5432

Редактировать: попробуйте это как ваш docker-compose.yml

 version: "2"
services:
  db:
    image: REMOTEURL:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_HOST_AUTH_METHOD: trust
    ports:
      - 5432:5432
 

Комментарии:

1. Спасибо за ответ. В коде, который я опубликовал, уже есть —publish 8000:8000 (что эквивалентно -p ) . Пробовал 5432: 5432, никакой разницы: (

2. Может быть, я просто неправильно понял ваш вопрос, не могли бы вы попытаться описать его еще раз?

3. Могу ли я увидеть ваш файл docker compose?

4. Попробуйте внести docker-compose.yml в редактирование из ответа

5. Также могу я спросить, что такое изображение REMOTEURL:latest ?