我有一个运行 postgresql 的容器,我想摄取一些我在 ETL 脚本中准备好的数据。我已经创建了数据库,但是,当我尝试通过 jupyter 笔记本连接本地计算机时,它一直说找不到主机,即使我在 .yaml 文件中设置了它。 我的 .yaml 文件是这样的:
version: '3.7'
services:
postgres:
image: library/postgres
container_name: postgres_db
restart: unless-stopped
ports:
- 5432:5432
environment:
- POSTGRES_PASSWORD=password123
- POSTGRES_USER=user123
- POSTGRES_DB=my_db
hostname: postgres
volumes:
- ./pgdata/data:/var/lib/postgresql/data
- ./initdb:/docker-entrypoint-initdb.d
在我的 jupyter 笔记本中,我有这个连接测试:
import psycopg2
DATABASE_HOST = 'postgres'
DATABASE_PORT = 5432
DATABASE_USER = 'user123'
DATABASE_PASSWORD = 'password123'
DATABASE_NAME = 'my_db'
conn = psycopg2.connect(
host=DATABASE_HOST,
port=DATABASE_PORT,
user=DATABASE_USER,
password=DATABASE_PASSWORD,
dbname=DATABASE_NAME
)
docker 端的日志永远不会随着任何类型的连接尝试而返回。
OperationalError: could not translate host name "postgres" to address: Unknown host
遇到的错误是因为的 Jupyter 笔记本无法识别
postgres
主机名。 这是因为
postgres
主机名特定于的 Docker 网络。
以下是如何解决此问题的几种方法:
1. 使用端口转发将 localhost 连接到容器
- 不需要修改 Docker Compose 文件。
-
通过以下命令启动的容器(如果尚未运行):
bash docker-compose up -d
-
使用以下代码连接到的数据库,将主机名替换为
localhost
:
```python import psycopg2
DATABASE_HOST = 'localhost'
DATABASE_PORT = 5432
DATABASE_USER = 'user123'
DATABASE_PASSWORD = 'password123'
DATABASE_NAME = 'my_db'
conn = psycopg2.connect( host=DATABASE_HOST, port=DATABASE_PORT, user=DATABASE_USER, password=DATABASE_PASSWORD, dbname=DATABASE_NAME ) ```
这将通过映射到主机上的端口 5432 的端口 5432 连接到的 Postgres 容器。
2. 将 Jupyter 连接到 Docker 网络
-
此方法允许使用容器名称
postgres
作为主机名。 -
获取 Docker 网络的名称:
bash docker network ls
找到与的 Postgres 容器关联的网络(可能是类似something_default
的名称)。 -
将的 Jupyter 笔记本连接到该网络(将
network_name
替换为的实际网络名称):bash docker network connect network_name <jupyter_container_name_or_id>
需要知道正在运行的 Jupyter 容器的名称或 ID。 -
现在,应该能够使用
postgres
作为主机名连接到的数据库,如的原始代码所示。
3. 使用容器的 IP 地址
-
获取的 Postgres 容器的 IP 地址:
bash docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres_db
-
在的 Python 代码中,将
DATABASE_HOST
替换为获取的 IP 地址:
```python DATABASE_HOST = '172.17.0.2' # 替换为的容器的实际 IP 地址 DATABASE_PORT = 5432 DATABASE_USER = 'user123' DATABASE_PASSWORD = 'password123' DATABASE_NAME = 'my_db'
conn = psycopg2.connect( host=DATABASE_HOST, port=DATABASE_PORT, user=DATABASE_USER, password=DATABASE_PASSWORD, dbname=DATABASE_NAME ) ```
选择最适合的方法。 如果只是想快速进行测试,第一个选项是最简单的。 如果需要从 Jupyter 笔记本中更永久地访问的数据库,则第二个选项更好。 第三个选项提供了另一种选择,但如果的容器重新启动并且其 IP 地址发生更改,则可能需要进行手动更新。
标签:python,postgresql,docker,jupyter,psycopg2 From: 78802845