Bahram
Bahram

Reputation: 1642

Problem connecting to postgresql hosted in docker

I have below error connecting to postgresql database hosted in docker.

myapp_Container | WARNING - ConnectionBus: Database connections: 0 active, 0 idle.
myapp_Container | ERROR - ConnectionBus: Opening JDBC connection to Some(db:54325) failed with SQLState: 08001 Error code: 0 Message: The connection attempt failed., giving up...(4/4)
myapp_Container | WARNING - ConnectionBus: Cannot create database connection.

I have two docker-compose files as below

APP Docker-Compose file

version: "3"
services:
  app:
    image: myapp
    container_name: myapp_Container
    ports:
      - "8081:8081"
    network_mode: postgres_net
    environment:
      - ADMIN_PASSWORD=Password1!
      - DATABASE_ENDPOINT=postgres://user:passwd@db:54325/mydb
    external_links:
      - db:localpostgres_1

DB Docker-Compose file

version: "3"

services:
  postgres:
    image: postgres
    container_name: localpostgres_1
    restart: always
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=passwd
      - TZ=Europe/Amsterdam
    ports:
      - 54325:5432
    networks:
      - postgres_net

networks:
  postgres_net:
    external: true

I created postgres_net via docker network create -d bridge postgres_net

Why am I doing this? I want to create apps with same docker-compose structure without creating a postgresql db for each, if I put them together like below it will work.

version: "3"
services:
  app:
    image: myapp
    container_name: myapp_Container
    ports:
      - "8081:8081"
    environment:
      - ADMIN_PASSWORD=Password1!
      - DATABASE_ENDPOINT=postgres://user:passwd@db/mydb
    links:
      - db

  db:
    image: postgres
    container_name: postgres_x
    ports:
      - "54320:5432"
    environment:
      - TZ=Europe/Amsterdam
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=passwd
    restart: always

I can connect to the Db via pgadmin, but can't understand why myapp cannot connect, please help

pg_hba.conf


local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust  

host    replication     all             ::1/128                 trust

host all all all md5

Upvotes: 0

Views: 657

Answers (2)

Bahram
Bahram

Reputation: 1642

this config worked perfectly

app docker-compose file

version: "3"
services:
  mendix:
    image: myapp
    container_name: myapp_Container
    ports:
      - "8081:8081"
    network_mode: postgres_net
    environment:
      - ADMIN_PASSWORD=Password1!
      - DATABASE_ENDPOINT=postgres://user:passwd@localpostgres_1/myapp
    external_links:
      - localpostgres_1

networks:
  postgres_net:
    external: true

db docker-compose

version: "3"

services:
  postgres:
    image: postgres
    container_name: localpostgres_1
    restart: always
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=passwd
      - TZ=Europe/Amsterdam
    ports:
      - 54325:5432
    networks:
      - postgres_net

networks:
  postgres_net:
    external: true

as probably people may know, one may run the docker-compose files in a different folder per application, because docker-compose cares about the path and overwrites the last container you created in a given folder.

Upvotes: 1

Mani
Mani

Reputation: 5648

You have not properly defined network in First compose file(App compose). You have specified postgres_net as network_mode: postgres_net which is invalid. You need to specify it properly like in the second compose file.

Corrected compose file will be:

APP Docker-Compose

version: "3"
services:
  app:
    image: myapp
    container_name: myapp_Container
    ports:
      - "8081:8081"
    environment:
      - ADMIN_PASSWORD=Password1!
      - DATABASE_ENDPOINT=postgres://user:passwd@db:54325/mydb
    networks:   # declare network here
      - postgres_net

networks: #define network
  postgres_net:
    external: true

DB Docker-Compose

version: "3"

services:
  postgres:
    image: postgres
    container_name: localpostgres_1
    restart: always
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=passwd
      - TZ=Europe/Amsterdam
    ports:
      - 54325:5432
    networks:
      - postgres_net

networks:
  postgres_net:
    external: true

Upvotes: 1

Related Questions