Home > Enterprise >  Program in docker can't connect to PostgreSQL in docker
Program in docker can't connect to PostgreSQL in docker

Time:12-28

I run my Golang API and PostgreSQL with docker-compose.

My log with error connection refused:

db_1   | 
db_1   | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1   | 
api_1  | Unable to connect to database: dial tcp 0.0.0.0:5432: connect: connection refusedartpaper_api_1 exited with code 1
db_1   | 2021-12-26 15:18:35.152 UTC [1] LOG:  starting PostgreSQL 14.1 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20211027) 10.3.1 20211027, 64-bit
db_1   | 2021-12-26 15:18:35.152 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2021-12-26 15:18:35.152 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2021-12-26 15:18:35.216 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2021-12-26 15:18:35.329 UTC [22] LOG:  database system was shut down at 2021-12-26 15:05:11 UTC
db_1   | 2021-12-26 15:18:35.515 UTC [1] LOG:  database system is ready to accept connections

My config:

config := pgx.ConnConfig{
        Host:     "0.0.0.0",
        Port:     5432,
        Database: "artpaper",
        User:     "admin",
        Password: "admin1",
    }

I think mistake in docker-compose.yml or Dockerfile for API, because on correct ports docker ps:

0.0.0.0:5432->5432/tcp    artpaper_db_1

Dockerfile for API:

FROM golang:1.17.5-alpine3.15

WORKDIR /artpaper

COPY ./ ./

RUN go mod download // download dependencies

RUN go build ./cmd/main/main.go // compile code to one binary file

EXPOSE 8080

CMD [ "./main" ] // run binary file

docker-compose.yml:

version: "3.3"

services:
  db:
    image: postgres:14.1-alpine3.15
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=artpaper
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin1
    ports:
      - 5432:5432
  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - db

Password and user in API config like in docker-compose.yml

Hostname from container with api is 0.0.0.0:5432

CodePudding user response:

In your Golang application try using: db:5432, not 0.0.0.0:5432.

version: '3.8'
services:
  db:
    image: postgres:14.1-alpine3.15
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=artpaper
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin1
    ports:
      - 5432:5432

  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - db

  debug:
    image: postgres:14.1-alpine3.15
    command: sleep 1d

Try connect to the database within:

docker-compose up -d

docker-compose exec debug ash -c 'psql -h db -U admin --dbname artpaper'

CodePudding user response:

First: In config database host should be a db like in docker-compose.yml

Second: Postgres as a program does not have time to turn on inside the container. I added in api code delay before connection to database.

  • Related