#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. или более поздней версии, вы можете скопировать рабочую строку подключения в этом формате для своей БД