未能初始化数据库,出现错误无法连接到`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
环境
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