psycopg2无法连接到Docker映像

时间:2019-05-04 09:55:22

标签: python django docker psycopg2

我已经如下启动了我的docker镜像:

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

并且我已经设置了我的django数据库配置:

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 个答案:

答案 0 :(得分:6)

您应将Docker容器卷与主机卷挂载

方法1:安装默认的套接字位置

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

方法2:安装到其他位置并在设置中指定

如@Thilak所述,

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

,然后将您的数据库主机设置更改为

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

HOST 必须使用大写字母


参考
1. Docker volumes


为什么Pycharm成功建立了连接?

我不确定连接建立如何在Pycharm上工作。但是,我假设Pycharm做了一些 直接连接 (就像我们通过终端一样)来检查状态。我首先无法通过终端登录psql控制台,但不能 以编程方式 (通过django或psycopg2 package)登录

答案 1 :(得分:4)

根据psycopg2的documentation。如果主机值为空,则默认情况下它将查找Postgres的Unix套接字文件。

在您的错误消息中,提到它正在tmp目录下寻找套接字文件( .s.PGSQL.5432 )。

如果您将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,

现在应该建立连接。

答案 2 :(得分:0)

Pycharm与Django设置有所不同。

当Django设置尝试连接到localhost时,Pycharm显式连接到''

只需将'localhost'作为您的HOST Django设置即可。

请注意,正确的设置名称是大写的HOSTPORT,而不是小写的hostport

答案 3 :(得分:0)

您应将Postgresql Docker容器的名称作为host键的值:

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
    }
}