postgresql - 连接到 Postgres 数据库的 Docker 容器
问题描述
将 Django docker 容器连接到 Postgres 数据库时,我收到以下错误。
File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line
130, in connect conn = _connect(dsn,
connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: could not connect to server:
Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
下面是我运行容器的 Dockerfile
FROM python:3.6
MAINTAINER c15523957
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y install libgdal-dev
RUN mkdir -p /usr/src/app
COPY requirements.txt /usr/src/app/
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
这是我的 Django 代码的 settings.py 文件中的代码
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'place_loc_db',
'USER': 'place_loc_user',
'PASSWORD': 'abc123',
'HOST': 'localhost',
'PORT': 5432,
}
}
注意:我没有将 postgres 数据库作为容器运行,而是在本地计算机上运行
注意:以下详细信息包含在我的 pg_hba.conf 和 postgresql.conf 文件中
postgresql.conf- >listen_addresses = '*'
pg_hba.conf -> host all all 0.0.0.0/0 md5
我已经阅读了上面打开数据库连接的以下详细信息。
解决方案
您似乎正在尝试连接到localhost
. 您的 Postgres 数据库与您的 django 应用程序不在同一个容器内运行,因此您无法在localhost
. 您需要将您的应用程序指向 Postgres 容器的地址。
如果您在用户定义的网络中运行容器(使用docker-compose会自动为您执行此操作),那么您可以使用容器名称作为主机名。
关于容器网络的文档是一个很好的起点。
更新
您在主机上运行 Postgres 的事实并没有显着改变答案:您仍然需要将您的 webapp 指向 Postgres 服务器的地址,而不是localhost
.
最简单的方法取决于您是在 Linux 上本地运行 Docker,还是在运行 Docker-For-X,其中 X 是 MacOS 或 Windows。
在 Linux 上,只需将您的 webapp 指向docker0
接口的 IP 地址。这是您主机的地址,并且由于您已将 Postgres 配置为侦听所有接口,因此应该可以正常工作。
如果您使用的是 Mac 或 Windows,则有一个特殊的“魔术主机名”,它指的是您主机上的服务。例如,在 MacOS 下阅读此内容以获取详细信息。在这两种情况下,您都可以将您的 webapp 指向host.docker.internal
.
推荐阅读
- ios - 像属性一样将 zip 文件存储到核心数据实体
- count - 如何通过 ec2 模块对多个实例使用不同的 user_data 模板
- corda - 在网络地图服务中确认网络参数
- django - Message() 得到了一个意外的关键字参数“初始”
- numpy - 为什么numpy数组np.array([(1,2,3,2,3,4)])的维度是2?
- php - 如何在 WooCommerce 中获取产品的品牌名称
- c# - 是否可以使用git标记所有文件
- azure - 如何将 .yml 作业脚本作为单个任务,作为具有其他步骤的管道的一部分?
- php - 没有这样的元素:无法找到元素:{"method":"css selector","selector":"body select[name='Accept']"}
- doctrine - mysql 函数的本机查询或 DoctrineExtensions