[英]How to connect to postgres created with docker-compose from outside host
[英]How connect to postgres from a golang app when using docker-compose?
我的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准備好。 實現此目的的簡單方法是:
這些的缺點是您不知道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
然后在wait-for-postgres.sh
-compose.yml中,更改網絡命令,如下所示:
command: ["./wait-for-postgres.sh", "db", "go", "run", "bot.go"]
我找到了答案,我已經在其他應用程序中運行過帶有postgres的容器,我沒有想到這一點,因為在構建db容器時docker compose不會顯示錯誤。 我使用了docker ps
然后使用了docker stop xxxxx
並從其他應用程序停止了db容器,然后構建並啟動了我的應用程序,問題已解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.