tobias
tobias

Reputation: 839

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

I use the following docker-compose.yml file:

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. Now when I try to access it from Python, say, with psycopg2 the following errors show up

>>> 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?

Upvotes: 0

Views: 346

Answers (3)

Aleksey Vaganov
Aleksey Vaganov

Reputation: 501

You should remove expose option from your docker-compose.yml file and add ports option such as:

ports:
  -"5432:5432"

Then you can connect to database by host localhost from your application.

Upvotes: 0

Ryan Nygard
Ryan Nygard

Reputation: 242

Instead of using expose us this instead:

ports:
  - "5432:5432"

This defines the port forwarding to the docker container

Upvotes: 0

Bruno Calza
Bruno Calza

Reputation: 2780

The problem is that expose does not publish the ports to the host machine. They are only accessible to linked services.

You have to manually publish the ports:

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

Upvotes: 1

Related Questions