首页 > 解决方案 > psycopg2 无法连接到 docker 镜像

问题描述

我已经按如下方式启动了我的 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 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 成功连接到容器

在此处输入图像描述

标签: pythondjangodockerpsycopg2

解决方案


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

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

如果你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,

现在应该建立连接。


推荐阅读