未能初始化数据库,出现错误无法连接到`host=user_db user=gorm database=gorm`

failed to initialize database, got error failed to connect to `host=user_db user=gorm database=gorm`

环境

gorm.io/gorm v1.20.6
gorm.io/driver/postgres v1.0.

错误文本

user_1     | [error] failed to initialize database, got error failed to connect to `host=user_db user=gorm database=gorm`: dial error (dial tcp 172.18.0.2:9920: connect: connection refused)
user_1     | panic: failed to connect to `host=user_db user=gorm database=gorm`: dial error (dial tcp 172.18.0.2:9920: connect: connection refused)

所有日志

$ docker-compose up
Starting urlshortener_user_db_1 ... done
Starting urlshortener_user_1    ... done
Starting urlshortener_gateway_1 ... done
Attaching to urlshortener_user_db_1, urlshortener_user_1, urlshortener_gateway_1
user_db_1  | 
user_db_1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
user_db_1  | 
user_db_1  | 2020-11-13 04:21:54.059 UTC [1] LOG:  starting PostgreSQL 13.0 on x86_64-pc-linux-musl, compiled by gcc (Alpine 9.3.0) 9.3.0, 64-bit
user_db_1  | 2020-11-13 04:21:54.059 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
user_db_1  | 2020-11-13 04:21:54.059 UTC [1] LOG:  listening on IPv6 address "::", port 5432
user_db_1  | 2020-11-13 04:21:54.070 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
gateway_1  | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
gateway_1  | 
gateway_1  | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
gateway_1  |  - using env:      export GIN_MODE=release
gateway_1  |  - using code:     gin.SetMode(gin.ReleaseMode)
gateway_1  | 
gateway_1  | [GIN-debug] POST   /api/v1/users/login       --> github.com/Asuha-a/URLShortener/api/controllers.Login (3 handlers)
gateway_1  | [GIN-debug] POST   /api/v1/users/signup      --> github.com/Asuha-a/URLShortener/api/controllers.Signup (3 handlers)
gateway_1  | [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
gateway_1  | [GIN-debug] Listening and serving HTTP on :8080
user_db_1  | 2020-11-13 04:21:54.082 UTC [21] LOG:  database system was interrupted; last known up at 2020-11-13 04:17:25 UTC
user_1     | 
user_1     | 2020/11/13 04:21:54 /go/src/github.com/Asuha-a/URLShortener/api/services/user/db/user.go:15
user_1     | [error] failed to initialize database, got error failed to connect to `host=user_db user=gorm database=gorm`: dial error (dial tcp 172.18.0.2:9920: connect: connection refused)
user_1     | panic: failed to connect to `host=user_db user=gorm database=gorm`: dial error (dial tcp 172.18.0.2:9920: connect: connection refused)
user_1     | 
user_1     | goroutine 1 [running]:
user_1     | github.com/Asuha-a/URLShortener/api/services/user/db.Init()
user_1     |    /go/src/github.com/Asuha-a/URLShortener/api/services/user/db/user.go:19 +0x1ed
user_1     | main.main()
user_1     |    /go/src/github.com/Asuha-a/URLShortener/api/services/user/main.go:34 +0x37
user_db_1  | 2020-11-13 04:21:54.175 UTC [21] LOG:  database system was not properly shut down; automatic recovery in progress
user_db_1  | 2020-11-13 04:21:54.180 UTC [21] LOG:  redo starts at 0/15D6CE0
user_db_1  | 2020-11-13 04:21:54.180 UTC [21] LOG:  invalid record length at 0/15D6D18: wanted 24, got 0
user_db_1  | 2020-11-13 04:21:54.180 UTC [21] LOG:  redo done at 0/15D6CE0
urlshortener_user_1 exited with code 2
user_db_1  | 2020-11-13 04:21:54.208 UTC [1] LOG:  database system is ready to accept connections

代码

docker-compose.yml

version: '3'

services:
  gateway:
    build:
      context: ./api/
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    tty:
      true
    depends_on:
      - user
  user:
    build:
      context: ./api/services/user
      dockerfile: Dockerfile
    ports:
      - 50051:50051
    tty:
      true
    depends_on: 
      - user_db
  user_db:
    image: postgres:alpine
    environment: 
      POSTGRES_USER: gorm
      POSTGRES_PASSWORD: gorm
      POSTGRES_DB: gorm
      POSTGRES_HOST: user_db
    ports:
      - 9920:9920

user.go(正在初始化数据库)

package db

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

var (
    db  *gorm.DB
    err error
)

// Init DB
func Init() {
    db, err = gorm.Open(postgres.New(postgres.Config{
        DSN: "host=user_db user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Tokyo",
    }), &gorm.Config{})
    if err != nil {
        panic(err)
    }
    autoMigration()
}

// Close DB
func Close() {
    dbSQL, err := db.DB()
    if err != nil {
        panic(err)
    }
    dbSQL.Close()
}

func autoMigration() {
    db.AutoMigrate(&User{})
}

我试过的

当我在 docker-compose.yml 中添加 'container_name: "user_db"' 时,我得到了同样的错误。

当我将主机名更改为 'user_db:9920' 时,它似乎无法被识别为主机名。

user_1     | [error] failed to initialize database, got error failed to connect to `host=user_db:9920 user=gorm database=gorm`: hostname resolving error (lookup user_db:9920: Try again)
user_1     | panic: failed to connect to `host=user_db:9920 user=gorm database=gorm`: hostname resolving error (lookup user_db:9920: Try again)

我想知道的

我知道我必须将容器名称设置为主机名,并且我设置了 docker-compose.yml.
中定义的 'user_db' 为什么我不能初始化数据库?

因为镜像postgres:alpine正在暴露端口5432

尝试将 - 9920:9920 更改为 - 5432:5432 并将连接字符串中的端口更改为 port=5432