fireproofsocks

fireproofsocks

Dumb question and one I used to know the answer to… but how does one connect to a postgres instance running inside docker-compose? I thought I would work through Broadway’s example repo GitHub - elixir-broadway/broadway_bike_sharing_rabbitmq_example: An example of a Broadway pipeline for a bike sharing app with RabbitMQ and PostgreSQL · GitHub – it uses docker-compose to spin up both a version of Postgres (one specifically with postgis installed) and an instance of RabbitMQ.

docker-compose up seems to have worked… no errors, and Docker Desktop shows 3 containers: rabbitmq-1, db-1, and app-1. RabbitMQ and Postgres are running, but the app has crashed because it can’t connect to the database.

Looking more closely, it seems like the port directive in docker-compose.yml is being ignored. I’ve deleted the images and rebuilt this several times in the course of testing it, and each time the ports used come up with something more random (?) like 53665. If I set my database client to use that port, I can connect.

Can someone clarify why this port is changing? And I seem to remember that the list of services defined inside of the docker-compose.yml corresponded to hostnames? Is that accurate? Like, instead of localhost, you might reference a hostname of db – but that doesn’t seem to work (even if I use the numeric extension).

First 10 of 19 Posts Switch mode

D4no0

D4no0

Yes, you can reference containers by their service names, no numeric extension should be added, the name should be exactly as it is defined in docker-compose.yml.

port option is for just exposing the container port to your host, the option port: "5432" will expose port 5432 from the container on your host on 5432.

I would recommend checking that your host 5432 port is free, otherwise map to a different port:

ports:
      - "5432:5433"

Also ensure that you are not connecting to some already exsting volumes with some strange Postgres configurations, a clean postgres/postgis container will always serve on port 5432 by default.

The last and the first thing I should have mentioned is to check that the database container has started as expected, it can happen that it will not start if it’s missing some mandatory configuration options (like username), you should have logs that it started accepting clients on port 5432.

fireproofsocks

fireproofsocks OP

That’s the thing: the port seems to be ignored. Each time I bring up the stack, postgres is binding to a new port. There is not a conflict that I can see, i.e.

lsof -i -P | grep -i "listen"

shows nothing bound to port 5432.

When I re-run docker-compose up, the images come up including the postgres image, but it binds to a seemingly random port, e.g. 59716.

The hostname does not seem to apply… I can connect to postgres using my db client using localhost as the hostname (and whatever random port it binds to). Using db or db-1 gets an error, e.g. getaddrinfo ENOTFOUND db. Maybe that hostname is only available to the containers themselves and not to the host OS?

I’m thinking next steps for me is to try ditching docker-compose and try spinning up the needed services as simple docker conainters (without docker-compose). But I am stymied.

arcanemachine

arcanemachine

You sure your setting your ports correctly? BTW the setting should be ports not port in your compose file (as implied by your first post). Also make sure you’ve got the external and internal ports configured if you want to access it via localhost. For example:

    ports:
      - "5432:5432"

If you’re still having issues, then let’s see that compose file.

dimitarvp

dimitarvp

You are only specifying the container port (i.e. the port that the container is listening on). When that is done then the host port (the port that your machine will be listening on to be able to connect you to the DB) will be chosen randomly.

As @arcanemachine points out, you need to specify both ports if you want full control. Example:

    ports:
      - "6000:5432"

This will make PostgreSQL accessible from your dev machine on port 6000, while the DB container will listen on 5432. Docker will make a tunnel so when you connect to localhost:6000 you will be actually connecting to db:5432. Which means that you can do this from your dev machine / host:

psql -U postgres -h localhost -p 6000 postgres --command 'SELECT version();'

…and it should work. If you have a password set then just prepend PGPASSWORD=123 in front of the above command.

Source: Define services in Docker Compose | Docker Docs

fireproofsocks

fireproofsocks OP

Thanks. This is coming back to me. It makes sense. Seems like we might need a PR for updating that example repo? Maybe it only works if you start the app from inside the docker container :thinking:

D4no0

D4no0

I’ve just ran the docker-compose and everything works as expected from the standpoint of database. It’s a very strange setup, but it works as expected without any issues.

What OS are you using? I’ve ran the example on ubuntu.

The only thing to keep in mind is that ecto migrations are not ran automatically, so you have to execute this command before starting the compose:

docker-compose run app mix setup
fireproofsocks

fireproofsocks OP

I just tried re-cloning this repo and I’m still seeing the same problems… docker-compose up brings up 2/3 of the containers – there are a bunch of db connection errors:

[error] Postgrex.Protocol (#PID<0.294.0>) failed to connect: ** (DBConnection.ConnectionError) tcp connect (db:5432): connection refused - :econnrefused

docker-compose run app mix setup also generates errors. What exactly are you running?

I’m on Mac OS 14.6.1

D4no0

D4no0

Just installed docker desktop on my mac and everything works. There is most probably an issue with your installation.

I’ve ran the following commands (note the usage of docker compose, the old command docker-compose is deprecated from long ago):

# Just because I am too lazy to setup the rabbitmq queue manually, 
# you should get errors that tables don't exist from app, 
# close after it runs for a few seconds
docker compose up 

docker compose run app mix setup
docker compose up

I’ve used such docker-compose setups a lot of times in production and there is nothing wrong with it, most probably you have some installation issues on your machine.

dimitarvp

dimitarvp

Can you try connecting to the host IP+port with psql, just to make sure that you actually can reach the DB? You can also run docker ps just to make sure as well.

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New

We're in Beta

About us Mission Statement