web-dev-qa-db-ja.com

「サーバー選択タイムアウトエラー」Dockerを使用したMongoDB Goドライバー

私は、MongoDBとDockerを使用して、Goの非常に基本的な(私は思った)スタータープログラムに取り組んでいます。仕事で使い始める前に、これらを理解しようとしています。公式のDockerイメージを使用して、ローカルホストを使用するだけで、MongoDBをDockerコンテナーで実行できます。これは正常に動作しています。MongoDBCompassを介して接続し、DBを変更できます。

次のタスクは、DBの読み取りと書き込みができる別のDockerコンテナーを構築することでした。 mgoはもう稼働していないため、MongoDB-Go-Driver( https://godoc.org/github.com/mongodb/mongo-go-driver/mongo )を使用しています。

これは私のコードです。単純な接続を作成するためにオンラインで多数のチュートリアルを実行し、接続を確認するためにDBにpingを送信しています。

client, err := mongo.Connect("mongodb://localhost:27017")

if err != nil {
    log.Fatal("error ", err)
}

// Check the connection
err = client.Ping(context.TODO(), nil)

if err != nil {
    log.Fatal("error2 ", err)
}

fmt.Println("Connected to MongoDB!")

error2 server selection timeoutを使用して、DBでの操作(Find、FindOne、Pingなど)を実行すると常に失敗します。

これは私が実行している私のdocker-composeファイルです。

version: "3"

services:
  datastore:
    image: mongo
    ports: 
      - "27017:27017"
    networks: 
      - maccaptionNet
    volumes: 
      - .:/go/src/maccaption_microservice/dbdata
  jobservice:
    image: jobservicemaccaption:1.0
    networks:
      - maccaptionNet
    depends_on:
      - "datastore"


networks: 
  maccaptionNet:
    driver: bridge

私はMongoDBを初めて使用しましたが、何時間もの調査を行った結果、これについては何の進展もありませんでした。私は https://docs.mongodb.com/manual/core/read-preference-mechanics/https://docs.mongodb.com/manual/replication/

誰かがこれを正しい方向に向けることができますか?私はこの特定の問題について多くを見つけることができませんでした。

ありがとう!

6
henleyhoudini

別のドッカーに接続している場合(docker-composeファイル、およびbridgeネットワークモードを使用して、localhostdatastoreのようなホスト名に変更する必要があります

client, err := mongo.Connect("mongodb://datastore:27017")

goスクリプトがlocalhostを使用する場合、データベースが同じDockerにあると想定します

2
grapes

どういうわけか私はこの問題を別の方法で修正しました:ports"27018:27017"から"27017:27017"に変更します。 IDKがこれを支援する理由。たぶん、Mongoがデフォルトのポートを認識しない場合、Mongoのノードのクラスターがあると考えられます。

0
VadimFilin

私の回答は無関係かもしれないと思いますが、それでも同じエラーが発生しました。それは、私のIPアドレスがMongoDBアトラスの[IPホワイトリスト]タブにリストされていなかったためです。接続を試みる前に、IPアドレスがあることを確認してください。

0
Anurag Sanghvi

私は同じ問題を抱えていましたが、この問題に対処する別の方法を見つけました。 Dockerイメージの実行中にネットワークパラメータを渡すだけで、Dockerは正しいローカルホストを指すようになります。

docker run --network="Host" ....

このソリューションのソース

0
hyperloopfan