【问题标题】:Program in docker can't connect to PostgreSQL in dockerdocker中的程序无法连接到docker中的PostgreSQL
【发布时间】:2022-01-25 21:53:28
【问题描述】:

我使用 docker-compose 运行我的 Golang API 和 PostgreSQL。

我的日志有错误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

我的配置:

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

我认为 API 的 docker-compose.yml 或 Dockerfile 有错误,因为在正确的端口上 docker ps:

0.0.0.0:5432->5432/tcp    artpaper_db_1

API 的 Dockerfile:

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

API 配置中的密码和用户,如 docker-compose.yml

带有 api 的容器的主机名是 0.0.0.0:5432

【问题讨论】:

标签: docker docker-compose dockerfile


【解决方案1】:

首先:在配置数据库中主机应该是一个类似于 docker-compose.yml 的数据库

第二:Postgres作为一个程序没有时间在容器内开启。我在连接数据库之前添加了 api 代码延迟。

【讨论】:

    【解决方案2】:

    在您的 Golang 应用程序中尝试使用: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
    

    尝试在以下范围内连接数据库:

    docker-compose up -d

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

    【讨论】:

    • 现在这个Unable to connect to database: dial tcp 172.18.0.2:5432: connect: connection refused
    • 您能否更新问题中的日志docker-compose logs db 并显示您的应用使用的连接字符串?
    • @gohmc 完成。我从我的代码中添加了新的撰写输出和连接配置
    • 您的主机上是否有 psql,您可以尝试连接到数据库,例如:psql -h localhost -U admin --dbname artpaper
    • psql -h localhost -U admin --dbname artpaper Password for user admin: psql (11.14 (Debian 11.14-0+deb10u1), server 14.1) WARNING: psql major version 11, server major version 14. Some psql features might not work. Type "help" for help. artpaper=# 有效
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2017-06-18
    • 2019-09-28
    • 1970-01-01
    • 2019-08-09
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多