Rich Apodaca
Rich Apodaca

Reputation: 29004

How to connect to a Postgres database running in local Docker container through locally-run psql command?

I'm running a docker container with the vanilla Postgres image on my local machine. I'd like to connect to the database from my local machine (i.e., not from "within the container". However, on trying to connect, I get an error.

Here's my docker-compose.yml file:

version: "3.8"

services:
    db:
        image: postgres
        restart: always
        ports:
            - 5432:5432
        environment:
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD: mypassword

Here's how I start up:

docker-compose run db

Here's how I connect:

psql -h localhost -p 5432 -U postgres

This produces the error:

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?

If I spin up the database without Docker Compose, the same connection command works as expected:

docker run --name mypg -p 5432:5432 -e POSTGRES_PASSWORD=password postgres

I could just go with the flow and use the command above. But this seems to be pointing to a flaw in how I think about Docker/Compose. For example, maybe Docker Compose's internal DNS resolver makes this approach fail.

Any ideas?

Version info:

psql --version
psql (PostgreSQL) 13.3

I have read through several SO posts, including these, but they don't address or fix the problem I'm seeing:

Upvotes: 0

Views: 2641

Answers (1)

Alex MacArthur
Alex MacArthur

Reputation: 2286

Try docker-compose up db instead of run. Using run will run a one-off command against your container, whereas up will turn on the container and leave it running, so another application should be able to access it.

https://docs.docker.com/compose/faq/#whats-the-difference-between-up-run-and-start

Upvotes: 1

Related Questions