gpt4 book ai didi

postgresql - 使用 docker-compose 时如何从 golang 应用程序连接到 postgres?

转载 作者:IT王子 更新时间:2023-10-29 02:29:06 27 4
gpt4 key购买 nike

我的 docker-compose 文件

version: "2" 
services: db:
restart: always
image: postgres:latest
ports:
- "5435:5432"
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: user
POSTGRES_DB: db adminer:
web:
image: golang:1.7
working_dir: /go/src/app
command: go run bot.go
ports:
- "3000:3000"
volumes:
- ./bot:/go/src/app
links:
- db
environment:
PORT: 3000
CONNECTION_STRING_DEV: postgres://user:password@db/db

和我的 bot.go,我尝试连接的地方

db, err = sql.Open("postgres", "user=user password=password host=db dbname=db port=5432 sslmode=verify-full ")

当我启动我的容器时,我看到错误:

panic: dial tcp 5.61.14.99:5432: getsockopt: connection refused

我更改了 5432 上的端口并尝试这样连接:

db, err = sql.Open("postgres", "postgres://user:password@db/db")

但我得到了同样的错误

我的 docker-compose 设置有什么问题?

最佳答案

您的 docker-compose 看起来有点乱,但这可能是复制和粘贴造成的。当 Go 尝试连接时,postgres 可能尚未启动并运行。要测试这是否是问题所在,首先:

docker-compose up -d db

然后通过检查等到 postgres 准备就绪:

docker-compose logs -f db

并寻找像这样的日志行:

db_1   | LOG:  database system is ready to accept connections

当该行出现时,退出日志命令 (Ctrl+C) 并运行您的机器人:

docker-compose up web

如果它现在可以正常工作,那确实是您的问题。

解决方案:等到 postgres 就绪。实现这一点的简单方法是:

  • 在运行网络之前睡一段时间(例如 1 分钟)
  • 在连接之前在网络中休眠
  • 连接失败时休眠5秒,无限重试

这些的缺点是您不知道 postgres 何时准备就绪,因此您可能等待太久或不够长。更好的解决方案是仅在成功连接到 postgres 后才运行您的机器人。

示例来自 https://docs.docker.com/compose/startup-order/ :

#!/bin/bash
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until psql -h "$host" -U "postgres" -c '\l'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd

将此脚本添加为 wait-for-postgres.sh 并在您的 docker-compose.yml 中更改 web 的命令,如下所示:

command: ["./wait-for-postgres.sh", "db", "go", "run", "bot.go"]

关于postgresql - 使用 docker-compose 时如何从 golang 应用程序连接到 postgres?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com