Ошибка подключения к облаку MongoDB из Docker

#python #mongodb #docker #dns

#python #mongodb #docker #dns

Вопрос:

Я протестировал приложение на своем ноутбуке, моем сервере и другом ноутбуке.

Я каждый раз менял DNS, но это проблема, с которой я сталкиваюсь:

 pymongo.errors.ConfigurationError: None of DNS query names exist: _mongodb._tcp.xxxxxx-shard-00-00-uzn6y.mongodb.net., _mongodb._tcp.xxxxxx-shard-00-00-uzn6y.mongodb.net.
 

Строка, генерирующая эту ошибку:

 myclient = MongoClient(con_string)
 

и con_stirng является:

 mongodb srv://root:<password>@xxxxxx-xxxxxx.mongodb.net/test?retryWrites=true
 

Я также пробовал без «srv»:

 mongodb://root:<password>@xxxxxx-xxxxxx.mongodb.net/test?retryWrites=true
 

Все это выполняется в контейнере Docker, и я использую Flask.
Когда я запускаю приложение без Docker, DNS разрешается, однако это не тот случай, когда я запускаю его в контейнере.

Это то, что я пробовал до сих пор:

 docker run -it -p 5000:5000 --env-file vars.env myapp

docker run -it -p 5000:5000  --dns=8.8.8.8 --env-file vars.env myapp

docker network create demo amp;amp; docker run -it -p 5000:5000  --network demo --env-file vars.env myapp

docker run -it -p 5000:5000  --network demo --volumes /etc/resolv.conf:/etc/resolv.conf --env-file vars.env myapp

docker run -it -p 5000:5000 --volumes /etc/resolv.conf:/etc/resolv.conf --env-file vars.env myapp
 

Ни одно из вышеперечисленных действий не разрешило адрес экземпляра mongocloud.

Это полная трассировка:

 Traceback (most recent call last):
  File "/folder//venv/lib/python3.6/site-packages/pymongo/uri_parser.py", line 287, in _get_dns_srv_hosts
    results = resolver.query('_mongodb._tcp.'   hostname, 'SRV')
  File "/folder//venv/lib/python3.6/site-packages/dns/resolver.py", line 1102, in query
    lifetime)
  File "/folder//venv/lib/python3.6/site-packages/dns/resolver.py", line 1002, in query
    raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses)
dns.resolver.NXDOMAIN: None of DNS query names exist: _mongodb._tcp.xxxxxx-shard-00-00-xxxxxx.mongodb.net., _mongodb._tcp.xxxxxx-shard-00-00-xxxxxx.mongodb.net.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 63, in <module>
    myclient = MongoClient(con_string)
  File "/folder//venv/lib/python3.6/site-packages/pymongo/mongo_client.py", line 494, in __init__
    res = uri_parser.parse_uri(entity, port, warn=True)
  File "/folder//venv/lib/python3.6/site-packages/pymongo/uri_parser.py", line 399, in parse_uri
    nodes = _get_dns_srv_hosts(fqdn)
  File "/folder//venv/lib/python3.6/site-packages/pymongo/uri_parser.py", line 289, in _get_dns_srv_hosts
    raise ConfigurationError(str(exc))
pymongo.errors.ConfigurationError: None of DNS query names exist: _mongodb._tcp.xxxxxx-shard-00-00-xxxxxx.mongodb.net., _mongodb._tcp.xxxxxx-shard-00-00-xxxxxx.mongodb.net.
 

Комментарии:

1. _mongodb._tcp часть выглядит неправильно. Имя домена должно начинаться с имени кластера. Какую версию драйвера вы используете?

Ответ №1:

Я нашел решение. Строка узла подключения должна быть: :

 xxxxxxxxxx-shard-00-00-xxxxxxxxxxxx.mongodb.net:27017,xxxxxxxx-shard-00-01-xxxxxxxx.mongodb.net:27017,xxxxxxxxx-shard-00-02-xxxxxxxxx.mongodb.net:27017/test?ssl=trueamp;replicaSet=xxxxxxxxxxxxxxx-shard-0amp;authSource=adminamp;retryWrites=true 
 

Комментарии:

1. Если вы используете MongoDB Cloud, то: Connect -> Подключите свое приложение -> выберите драйвер python 3.4. или более поздней версии, вы можете скопировать рабочую строку подключения в этом формате для своей БД