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).
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 10 of 19 Posts
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.portoption is for just exposing the container port to your host, the optionport: "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:
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
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.
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
localhostas the hostname (and whatever random port it binds to). Usingdbordb-1gets 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
You sure your setting your ports correctly? BTW the setting should be
portsnotportin 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 vialocalhost. For example:If you’re still having issues, then let’s see that compose file.
fireproofsocks
I’m literally just trying to kick the official tires: broadway_bike_sharing_rabbitmq_example/docker-compose.yml at main · elixir-broadway/broadway_bike_sharing_rabbitmq_example · GitHub
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:
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:6000you will be actually connecting todb:5432. Which means that you can do this from your dev machine / host:…and it should work. If you have a password set then just prepend
PGPASSWORD=123in front of the above command.Source: Define services in Docker Compose | Docker Docs
fireproofsocks
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
D4no0
I’ve just ran the
docker-composeand 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:
fireproofsocks
I just tried re-cloning this repo and I’m still seeing the same problems…
docker-compose upbrings up 2/3 of the containers – there are a bunch of db connection errors:docker-compose run app mix setupalso generates errors. What exactly are you running?I’m on Mac OS 14.6.1
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 commanddocker-composeis deprecated from long ago):I’ve used such
docker-composesetups a lot of times in production and there is nothing wrong with it, most probably you have some installation issues on your machine.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 rundocker psjust to make sure as well.