简体   繁体   English

如何访问使用 docker-compose 设置的 postgresql 数据库?

[英]How do I access a postgresql DB that was setup with docker-compose?

I use the following docker-compose.yml file:我使用以下 docker-compose.yml 文件:

version: '3.8'

services:
  db:
    image: postgres:13-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    expose:
      - 5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=testdb
volumes:
  postgres_data:

I bring it up with docker-compose up -d --build .我提出了docker-compose up -d --build Now when I try to access it from Python, say, with psycopg2 the following errors show up现在,当我尝试使用 psycopg2 从 Python 访问它时,会出现以下错误

>>> conn = psycopg2.connect(host="localhost", database="testdb", user="postgres", password="postgres")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?

>>> conn = psycopg2.connect(host="db", database="testdb", user="postgres", password="postgres")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "db" to address: nodename nor servname provided, or not known

Could you help me to resolve that?你能帮我解决这个问题吗?

The problem is that expose does not publish the ports to the host machine.问题是expose不会将端口发布到主机。 They are only accessible to linked services.它们只能被链接的服务访问。

You have to manually publish the ports:您必须手动发布端口:

docker-compose run -d -p 5432:5432 db

Instead of using expose us this instead:而不是使用暴露我们这个来代替:

ports:
  - "5432:5432"

This defines the port forwarding to the docker container这定义了端口转发到 docker 容器

You should remove expose option from your docker-compose.yml file and add ports option such as:您应该从 docker-compose.yml 文件中删除公开选项并添加端口选项,例如:

ports:
  -"5432:5432"

Then you can connect to database by host localhost from your application.然后,您可以通过应用程序中的主机localhost连接到数据库。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM