无法连接到 Postgres(使用 Go 和 Docker)

问题描述 投票:0回答:1

我正在尝试制作一个分别包含 Go 模块和 Postgres 数据库的 Docker 容器。 但是我的 Go 模块无法连接到我的 Postgres 数据库。

我尝试过以下方法:

.env

HOST=0.0.0.0
SERVER_PORT=3000
DB_USER=postgres
DB_PASSWORD=12345
DB_NAME=unity
DB_PORT=5432

docker-compose.yaml

version: "3.8"
services:
  scraper:
    build: .
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    env_file:
      - .env
    ports:
      - "${SERVER_PORT}:${SERVER_PORT}"
    volumes:
      - .:/usr/src/app
    command: go run cmd/main.go
  air:
    image: cosmtrek/air:latest
    # working_dir value has to be the same of mapped volume
    working_dir: /usr/src/app
    ports:
      - 3001:3001
    environment:
      - ENV_A=${ENV_A}
      - ENV_B=${ENV_B}
      - ENV_C=${ENV_C}
    volumes:
      - .:/usr/src/app
  postgres:
    image: postgres:latest
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}
    ports:
      - "${DB_PORT}:${DB_PORT}"
    volumes:
      - postgres_db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d ${DB_NAME} -U ${DB_USER}"]
      interval: 3s
      timeout: 3s
      retries: 5
volumes:
  postgres_db:

database.go

package databases

import (
    "fmt"
    "log"
    "os"

    "github.com/DespairServices/despair-services-scrapper/internal/models"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

var db *gorm.DB
var dsn string = fmt.Sprintf(
    "host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Shanghai",
    os.Getenv("HOST"),
    os.Getenv("DB_USER"),
    os.Getenv("DB_PASSWORD"),
    os.Getenv("DB_NAME"),
    os.Getenv("DB_PORT"),
)

func Connect() {

    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
    })

    if err != nil {
        log.Fatal("Failed to connect to database. \n", err)
        os.Exit(2)
    }

    log.Println("Database Connected!")

    log.Println("Running Migrations...")
    db.AutoMigrate(&models.Asset{})
    log.Println("Migrations Done!")
}

启动 Postgres 时,它向我确认正在使用的 IP:

2024-04-05 21:03:27 2024-04-06 01:03:27.074 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2024-04-05 21:03:27 2024-04-06 01:03:27.074 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2024-04-05 21:03:27 2024-04-06 01:03:27.083 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2024-04-05 21:03:27 2024-04-06 01:03:27.093 UTC [29] LOG:  database system was shut down at 2024-04-06 01:00:11 UTC
2024-04-05 21:03:27 2024-04-06 01:03:27.103 UTC [1] LOG:  database system is ready to accept connections

但是我的 Go 模块无法连接到该地址...

2024-04-05 21:04:48 2024/04/06 01:04:48 /usr/src/app/internal/databases/database.go:26
2024-04-05 21:04:48 [error] failed to initialize database, got error failed to connect to `host=0.0.0.0 user=postgres database=unity`: dial error (dial tcp 0.0.0.0:5432: connect: connection refused)

我现在很困惑,感谢任何帮助。

postgresql docker go
1个回答
0
投票

TLDR 使用数据库服务的 Docker 网络名称 (

postgres
) 而不是 0.0.0.0。更改
.env
中的第一行:

HOST=postgres
SERVER_PORT=3000
DB_USER=postgres
DB_PASSWORD=12345
DB_NAME=unity
DB_PORT=5432

详情

最少的设置即可使其正常工作,剥离非必要的服务等。

🗎

docker-compose.yml

version: "3.8"
services:
  scraper:
    build: .
    depends_on:
      postgres:
        condition: service_healthy
    env_file:
      - .env
  postgres:
    image: postgres:latest
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d ${DB_NAME} -U ${DB_USER}"]
      interval: 3s
      timeout: 3s
      retries: 5
volumes:
  postgres_db:

🗎

Dockerfile

FROM golang:alpine3.19

RUN apk add --no-cache curl

WORKDIR /app

COPY . .

RUN go mod tidy
RUN go build -o main .

CMD ./main

🗎

main.go
(基于您的
database.go
,但没有迁移。)

package main

import (
    "fmt"
    "log"
    "os"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

var db *gorm.DB
var dsn string = fmt.Sprintf(
    "host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Shanghai",
    os.Getenv("HOST"),
    os.Getenv("DB_USER"),
    os.Getenv("DB_PASSWORD"),
    os.Getenv("DB_NAME"),
    os.Getenv("DB_PORT"),
)

func main() {   
    var err error
    db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
    })

    if err != nil {
        log.Fatal("Failed to connect to database. \n", err)
        os.Exit(2)
    }

    log.Println("Database Connected!")
}
© www.soinside.com 2019 - 2024. All rights reserved.