psycopg2 не может подключиться к докеру - PullRequest
14 голосов
/ 04 мая 2019

Я запустил свой образ докера следующим образом:

docker run --name fnf-postgis -e POSTGRES_DB=fnf -e POSTGRES_USER=fnfuser -e POSTGRES_PASSWORD=fnf2pwd -p5432:5432 -d mdillon/postgis:11

и я настроил мою конфигурацию django db:

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'fnf',
        'USER': 'fnfuser',
        'PASSWORD': 'fnf2pwd',
        'host': '',
        'port': 5432,

Однако при запуске makemigrations выдает эту ошибку:

psycopg2.OperationalError: не удалось подключиться к серверу: такого файла нет или каталог Сервер работает локально и принимает соединения на доменном сокете Unix "/tmp/.s.PGSQL.5432"?

но я могу успешно подключиться к контейнеру из pycharm

enter image description here

Ответы [ 4 ]

6 голосов
/ 10 мая 2019

Вы должны смонтировать том контейнера-докера с томом хост-машины

Метод 1: смонтировать расположение сокета по умолчанию

docker run <b>-v "/var/run/postgresql:/var/run/postgresql"</b> --name fnf-postgis -e POSTGRES_DB=fnf -e POSTGRES_USER=fnfuser -e POSTGRES_PASSWORD=fnf2pwd  -p5432:5432  mdillon/postgis:11

Способ-2: смонтировать в другое место и указать в настройках

как упомянул @Thilak,

docker run <b>-v "/path/to/some/dir:/var/run/postgresql"</b> --name fnf-postgis -e POSTGRES_DB=fnf -e POSTGRES_USER=fnfuser -e POSTGRES_PASSWORD=fnf2pwd  -p5432:5432  mdillon/postgis:11

и затем измените настройки DB HOST на

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'fnf',
        'USER': 'fnfuser',
        'PASSWORD': 'fnf2pwd',
        <b>'HOST': '/path/to/some/dir', # this value should be same as in the docker run command</b>
        'PORT': 5432,
    }
}

Клавиша HOST должна быть заглавными буквами


Ссылка
1. Тома докера


Почему Pycharm установил успешное соединение?

Я не уверен, как установление соединения работает на Pycharm. Но я предполагаю, что Pycharm сделал прямое соединение (как мы делаем через терминал), чтобы проверить статус. Я могу войти в консоль psql в первую очередь через терминал, но не программно (через django или psycopg2 пакет )

4 голосов
/ 10 мая 2019

Согласно документации psycopg2 . Если значение хоста пустое, то по умолчанию оно будет искать файл Unix Socket Postgres.

И в вашем сообщении об ошибке упоминается, что он ищет файл сокета ( .s.PGSQL.5432 ) в каталоге tmp.

Если вы используете postgres как отдельный контейнер, то вы можете найти этот файл сокета в каталоге /var/run/postgresql вашего контейнера.

Вы можете смонтировать эту папку на свой хост, как показано ниже:

docker run -e POSTGRES_PASSWORD=mysecretpassword -v /home/username/socket_dir:/var/run/postgresql -d postgres

, затем вы можете обновить объект DATABASE , как показано ниже:

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'fnf',
        'USER': 'fnfuser',
        'PASSWORD': 'fnf2pwd',
        'host': '/home/username/socket_dir/',
        'port': 5432,

Теперь соединение должно быть установлено.

0 голосов
/ 14 мая 2019

Вы должны указать имя контейнера-докера postgresql как значение для host key:

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'fnf',
        'USER': 'fnfuser',
        'PASSWORD': 'fnf2pwd',
        'HOST': 'fnf-postgis', # Name of postgres docker container
        'PORT': 5432, # Its exposed port
    }
}
0 голосов
/ 13 мая 2019

Существует разница между вашим Pycharm и вашими настройками Django.

Pycharm явно подключается к localhost, когда настройка Django пытается подключиться к ''.

Простое помещение 'localhost' как ваша HOST настройка Django должна работать.

Обратите внимание, что правильные названия настроек - это прописные буквы HOST и PORT, а не строчные host и port.

...