2017-10-06 110 views
0

我的搬運工,撰寫文件如何使用docker-compose從golang應用連接到postgres?

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:[email protected]/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:[email protected]/db") 

但我得到相同的錯誤

我的docker-compose設置有什麼問題?

+0

謝謝,我更改了bot.go中的代碼,使用os.Getenv(「CONNECTION_STRING_DEV」),但它沒有解決我的問題 – ConorHolt

+0

os.Getenv(「CONNECTION_STRING_DEV」)的值是什麼? – mkopriva

+0

你嘗試過沒有ssl嗎? 'postgres:// user:password @ db/db?sslmode = disable'或'user = user password = password host = db dbname = db port = 5432 sslmode = disable'。 – mkopriva

回答

0

我找到答案,我跑容器postgres已經在其他應用程序,我沒有想到這一點,因爲碼頭構建沒有顯示錯誤時生成分貝容器。我用docker ps然後docker stop xxxxx停止從其他應用程序的數據庫容器,然後建立和我的應用程序,並解決問題。

2

您的碼頭構成看起來有點雜亂,但這可能是從複製&後。 當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準備就緒。簡單的方法來連接失敗時,連接

  • 之前運行的Web內網
  • 睡覺前實現這一目標是

    • 睡眠量(例如1分鐘)的時間,睡眠5秒鐘,indefinetly重新嘗試

    這些的缺點是你不知道什麼時候postgres準備好了,也就是說你等待時間太長或者不夠長。更好的解決方案是隻有在成功連接到postgres後才能運行bot.go。

    https://docs.docker.com/compose/startup-order/

    #!/bin/bash 
    # wait-for-postgres.sh 
    
    set -e 
    
    host="$1" 
    shift 
    cmd="[email protected]" 
    
    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和你泊塢窗,compose.yml爲網絡這樣修改命令:

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

    謝謝,它非常好的答案,我瞭解我如何測試我的容器。我運行「db」容器,然後容器「web」,但看到相同的錯誤,然後我添加代碼超時,但它不工作。所以這可能是pg_hba.conf錯誤? – ConorHolt

    +1

    運行db之後,你是否等待postgres準備好了?我不認爲這是一個配置問題,因爲錯誤消息指出較低級別的問題。 – AleGra

    +0

    是的,日誌:數據庫系統已準備好接受連接 如果我運行sudo docker-compose ps,我會看到docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp – ConorHolt