我已经如下启动了我的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成功连接到容器
答案 0 :(得分:6)
您应将Docker容器卷与主机卷挂载
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
如@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设置即可。
请注意,正确的设置名称是大写的HOST
和PORT
,而不是小写的host
和port
。
答案 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
}
}