簡體   English   中英

使用docker-compose時如何從golang應用連接到Postgres?

[英]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准備好。 實現此目的的簡單方法是:

  • 在運行網絡之前要睡眠一段時間(例如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然后在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM