2017-10-06 3 views
0

私のドッキングウィンドウ・コンファイルdocker-composeを使用している場合、golangアプリからポストグルに接続するにはどうすればよいですか?

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 

と私は私のコンテナを起動すると、私はエラーが表示

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

を接続してみてください、私のbot.go、:

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

I 5432でポートを変更し、このように接続しようとしました:

db, err = sql.Open("postgres", "postgres://user:[email protected]/db") 

が、私は私のドッキングウィンドウ・コンセットアップと

は何が問題になっていますと同じエラーを取得しますか?

+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、私はこれについて考えていなかったので、ドッカーの作成はdbコンテナをビルドするときにエラーを表示しなかったためです。私はdocker psを使用してdocker stop xxxxxを使用し、他のアプリケーションからdbコンテナを停止し、ビルドしてアプリケーションをアップして問題を解決しました。

2

あなたのドッカーの作成はちょっと面倒ですが、おそらくコピー&投稿からです。 Goが接続しようとすると、postgresがまだ起動していない可能性があります。&

db_1 | LOG: database system is ready to accept connections 

:それが問題だ場合、最初、テストするには:Postgresは

docker-compose logs -f db 

と同様にログ行を探して操作を実行して起動して実行するまで

docker-compose up -d db 

を待ちその行が表示され、ログコマンド(Ctrl + C)をキャンセルしてボットを実行します。

docker-compose up web 

これが正常に機能していれば、実際問題です。

解決方法:postgresが準備完了するまで待ちます。これを達成するための簡単な方法は、接続が失敗したときに

  • を接続する前に、ウェブ内のWeb
  • 睡眠を実行する前に、5秒とindefinetly再試行してください
  • のための睡眠の時間(例えば1分)のための

    • 睡眠です

    これらの欠点は、いつ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

    yes、LOG:データベースシステムは接続を受け入れる準備ができています とsudo docker-compose psを実行すると、docker-entrypoint.sh postgresを参照してください。0.0.0.0:5432->5432/tcp – ConorHolt

    関連する問題