我使用一个组合文件创建了一个docker postgres容器:
postgres:
image: postgres:12-alpine
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"init.sql:
CREATE USER test WITH PASSWORD '123456';
ALTER USER test WITH SUPERUSER;
CREATE DATABASE test;我还通过运行以下命令创建了一个pgAdmin4容器:
docker pull dpage/pgadmin4
docker run -p 5050:80 \
-e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
-e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
-d dpage/pgadmin4在pgAdmin中设置连接时。我需要通过查看postgres容器IPAddress:docker container inspect 02e83f5f39d6 | grep IPAddress来设置到172.17.0.2的服务器连接,使用本地主机作为连接字符串在pgAdmin4中将失败。
但是,当我使用python sqlalchemy时,我可以连接到localhost:5432。
import pandas as pd
from sqlalchemy import create_engine, MetaData
eng = create_engine('postgresql://test:123456@localhost:5432/test', echo=True)
meta = MetaData()
meta.reflect(eng, schema='public')这是令人困惑的。为什么pgAdmin无法识别端口映射?是因为它是从另一个容器运行的吗?那么正确的设置应该是什么呢?
发布于 2019-10-02 06:08:42
localhost是相对于容器/主机的。
对于pgAdmin容器,localhost本身就是它自己。因此,您需要指定IP以使pgAdmin指向正确的主机。
类似地,对于在您的机器上运行的python脚本,localhost是主机(您的PC)。但是,由于您指定了端口映射postgres,localhost:5432上的端口由docker postgres container端口5432转发。因此,如果脚本连接到localhost:5432 -它被docker转发到容器。
使用此设置没有任何错误。最好将pgAdmin容器作为同一合成文件的一部分。这样,您就可以将服务的名称用作到容器IP的DNS映射,以便于管理。
https://stackoverflow.com/questions/58192812
复制相似问题