sc4224

sc4224

Docker-compose phoenix postgresql

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

Marked As Solved

NobbZ

NobbZ

I do not understand that one…

ENTRYPOINT /usr/bin/entrypoint.sh
#!/usr/bin/env bash
set -ex

mix ecto.create
mix ecto.migrate

mix phx.server

Also Liked

NobbZ

NobbZ

TL;DR: Set them in a way, that makes you able to keep them in synch easily.


The environment key 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>.exs or passing them as environment variable into the client container as well.

But vault managed 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

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 .env file and then load it in both services with env_file in compose (instead of inlining and duplicating them with environment).

Last Post!

NobbZ

NobbZ

I mean this:

    volumes:
          - ./data/db:/data/db

But Okay, you are using a relative path there, so its not that bad as I thought. Still I strictly prefer named volumes which are then managed by docker.

Where Next?

Popular in Questions Top

Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49266 226
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44778 311
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42716 114
New

We're in Beta

About us Mission Statement