sc4224
I have a problem running my dockerized phoenix application with postgresql.
I specified my docker-compose.yml file to include two services: my phoenix service, build by a dockerfile and a latest postgres image taken from docker hub.
My dockerfile for phoenix looks like this:
# base image elixer to start with
FROM elixir:1.6
# install hex package manager
RUN mix local.hex --force
RUN mix local.rebar --force
# install the latest phoenix
RUN mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez --force
# create app folder
RUN mkdir /app
COPY ./my_app /app
WORKDIR /app
# install dependencies
RUN mix deps.get
# run phoenix in *dev* mode on port 4000
# CMD mix phx.server
My docker-compose.yml file looks like this:
version: '3.6'
services:
phoenix:
build:
context: .
dockerfile: Dockerfile.phoenix.development
ports:
- 4000:4000
volumes:
- ./my_app:/app
depends_on:
- db
- redis
environment:
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
FACEBOOK_CLIENT_ID: ${FACEBOOK_CLIENT_ID}
FACEBOOK_CLIENT_SECRET: ${FACEBOOK_CLIENT_SECRET}
command: mix ecto.create && mix ecto.migrate && mix phx.server
db:
container_name: db
restart: always
image: postgres:latest
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD="some_pass"
- POSTGRES_USER="some_user"
volumes:
- ./data/db:/data/db
Here is the error:
phoenix_1 |
phoenix_1 | 10:07:19.148 [error] GenServer #PID<0.234.0> terminating
phoenix_1 | ** (RuntimeError) Connect raised a KeyError error. The exception details are hidden, as
phoenix_1 | they may contain sensitive data such as database credentials.
phoenix_1 |
phoenix_1 | (elixir) lib/keyword.ex:377: Keyword.fetch!/2
phoenix_1 | (postgrex) lib/postgrex/protocol.ex:577: Postgrex.Protocol.startup/2
phoenix_1 | (postgrex) lib/postgrex/protocol.ex:504: Postgrex.Protocol.handshake/2
phoenix_1 | (db_connection) lib/db_connection/connection.ex:135: DBConnection.Connection.connect/2
phoenix_1 | (connection) lib/connection.ex:622: Connection.enter_connect/5
phoenix_1 | (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
phoenix_1 | Last message: nil
phoenix_1 | State: Postgrex.Protocol
db | 2018-07-24 10:07:19.149 UTC [28] LOG: incomplete startup packet
phoenix_1 | ** (Mix) The database for MyApp.Repo couldn't be created: an exception was raised:
phoenix_1 | ** (RuntimeError) Connect raised a KeyError error. The exception details are hidden, as
phoenix_1 | they may contain sensitive data such as database credentials.
phoenix_1 |
phoenix_1 | (elixir) lib/keyword.ex:377: Keyword.fetch!/2
phoenix_1 | (postgrex) lib/postgrex/protocol.ex:577: Postgrex.Protocol.startup/2
phoenix_1 | (postgrex) lib/postgrex/protocol.ex:504: Postgrex.Protocol.handshake/2
phoenix_1 | (db_connection) lib/db_connection/connection.ex:135: DBConnection.Connection.connect/2
phoenix_1 | (connection) lib/connection.ex:622: Connection.enter_connect/5
phoenix_1 | (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
I’m able to run my phoenix app on localhost just fine without docker.
When I set this up with docker and docker-compose, I remember to switch the dev.exs file to reference the host “db”.
I wondering if this is an issue with my postgresql setup or my phoenix app setup
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
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
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #elixirconf-eu
- #metaprogramming
- #hex











Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
NobbZ
So the DB receives something.
Can you please check your exact versions of the database and the
postgrexpackage used?Also how does your configuration for the database looks like? Host, Port, Password, Username, etc?
sc4224
:postgrex, “>= 0.0.0”,
host, port, password, username are correct from my understanding
NobbZ
I asked for the exact version from your
mix.lockas it is in the Dockercontainer.Maybe our or elixirs understand differs from yours, could you just show them? Replacing literal secrets by dummy-values of course.
sc4224
“postgrex”: {:hex, :postgrex, “0.13.5”
config :my_app, MyApp.Repo,
adapter: Ecto.Adapters.Postgres,
username: System.get_env(“POSTGRES_USER”),
password: System.get_env(“POSTGRES_PASSWORD”),
database: “my_postgres_dev”,
hostname: “db”,
port: 5432,
pool_size: 10
maybe docker postgresql:latest doesn’t match postgrex?
NobbZ
Where does your phoenix container know those values from? You are only setting them in
db, soSystem.get_env/1will returnnil, which means in this context, that it shall delete the associated key.Also, could you please markdown to properly format your code?
sc4224
Sorry my bad.
The system should know this from the environment specified in the docker-compose.yml file under the service db that uses the latest postgres image since i hardcoded them there
Should i set them in the phoenix service?
NobbZ
TL;DR: Set them in a way, that makes you able to keep them in synch easily.
The
environmentkey is always for the surrounding image only.Usually you are passing those environment variables to the postgresql container to configure it.
Then you have to makje sure that all clients use the same credentials as passed into the postgres container. How you do this often depends on your overall architecture.
Most of the time its just hard-configuring them in the
config/<env>.exsor passing them as environment variable into the client container as well.But
vaultmanaged credentials are possible as well. Well, kind of… Changing the credentials for a repo requires it to kill the repos supervisor and restart it with new credentials as far as I understand…cnck1387
Each service needs its own reference to environment variables. You’ll want to add it to the phoenix service too.
You could also put those ENV variables into a file, such as a
.envfile and then load it in both services withenv_filein compose (instead of inlining and duplicating them withenvironment).sc4224
Thanks @cnck1387 I set my POSTGRES_USER and POSTGRES_PASSWORD in the .env file, but it does not seem to work. The error I get back is password authentication failed for user “my_username”. I use this same username and password on my localhost without containers and it works just fine. Just not with containers
cnck1387
That’s because the postgres image creates a default database and database user based on those environment variables on the first time it runs (assuming a volume is persisted).
Perhaps you changed those values after you’ve upped your project?
If that’s the case you’ll want to delete your postgres volume which you could do by running
docker-compose down -v, but please don’t run that in production. That’s just meant as a quick and easy way to destroy all volumes which is handy for development.If you’re in production you would want to either change your user and password values to match what they were when you first ran your compose project, or use psql to manually change the user / password to whatever new ones you set (similar to what you would do without Docker).