Psycopg2无法连接到Docker镜像。

17

我已经按照以下方式启动了我的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: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

但我可以成功地从PyCharm连接到容器。

进入图片描述


请展示您的PyCharm数据库连接设置。 - Brown Bear
@BearBrown 完成 - Tjorriemorrie
3
请将“host”更改为“localhost”,而不是空字符串。 - eran
我不确定,但是你不需要在“主机”中指定本地主机吗? - Michał Krzywański
我尝试了localhost和0.0.0.0,但都不行。 - Tjorriemorrie
运行 docker run.... 后,docker ps 的结果是什么?@Tjorriemorrie - JPG
3个回答

7
根据psycopg2的文档。如果主机值为空,则默认会查找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,

现在应该已经建立连接。

1

您的Pycharm和Django设置有所不同。

Pycharm明确连接到localhost,而Django设置尝试连接''

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

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


1

您应该将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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接