通过dockerauthentication错误pymongo

我试图连接到Docker容器内的一个数据库,然后在我的家用计算机的远程服务器内部。 docker集装箱端口27017绑定到服务器机器的端口27017

现在,我有一个Python3脚本,其目标是从我的家用计算机连接到这个数据库:

 from pymongo import MongoClient client=MongoClient('mongodb://myserverusername:myserverpass@server.dir.com:27017') database=client["my_collection"] cursor=database["my_collection"].find({}) print(next(cursor)) 

如果我执行我的脚本停在line 4 ,它工作正常,但是当我释放line 5 ,我得到以下错误:

 Traceback (most recent call last): File "testDatabase.py", line 9, in <module> print(next(cursor)) File "[...]/lib/python3.5/site-packages/pymongo/cursor.py", line 1132, in next if len(self.__data) or self._refresh(): File "[...]/lib/python3.5/site-packages/pymongo/cursor.py", line 1055, in _refresh self.__collation)) File "[...]/lib/python3.5/site-packages/pymongo/cursor.py", line 892, in __send_message **kwargs) File "[...]/lib/python3.5/site-packages/pymongo/mongo_client.py", line 950, in _send_message_with_response exhaust) File "[...]/lib/python3.5/site-packages/pymongo/mongo_client.py", line 961, in _reset_on_error return func(*args, **kwargs) File "[...]/lib/python3.5/site-packages/pymongo/server.py", line 99, in send_message_with_response with self.get_socket(all_credentials, exhaust) as sock_info: File "/usr/lib/python3.5/contextlib.py", line 59, in __enter__ return next(self.gen) File "[...]/lib/python3.5/site-packages/pymongo/server.py", line 168, in get_socket with self.pool.get_socket(all_credentials, checkout) as sock_info: File "/usr/lib/python3.5/contextlib.py", line 59, in __enter__ return next(self.gen) File "[...]/lib/python3.5/site-packages/pymongo/pool.py", line 852, in get_socket sock_info.check_auth(all_credentials) File "[...]/lib/python3.5/site-packages/pymongo/pool.py", line 570, in check_auth auth.authenticate(credentials, self) File "[...]/lib/python3.5/site-packages/pymongo/auth.py", line 486, in authenticate auth_func(credentials, sock_info) File "[...]/lib/python3.5/site-packages/pymongo/auth.py", line 466, in _authenticate_default return _authenticate_scram_sha1(credentials, sock_info) File "[...]/lib/python3.5/site-packages/pymongo/auth.py", line 209, in _authenticate_scram_sha1 res = sock_info.command(source, cmd) File "[...]/lib/python3.5/site-packages/pymongo/pool.py", line 477, in command collation=collation) File "[...]/lib/python3.5/site-packages/pymongo/network.py", line 116, in command parse_write_concern_error=parse_write_concern_error) File "[...]/lib/python3.5/site-packages/pymongo/helpers.py", line 210, in _check_command_response raise OperationFailure(msg % errmsg, code, response) pymongo.errors.OperationFailure: Authentication failed. 

我做错了什么?

Thans提前!

我回答我自己的问题,如果有人有同样的问题!

首先,你需要通过ssh连接到服务器,所以你必须从sshtunnel ,当然还有pymongo导入pymongo

 from sshtunnel import SSHTunnelForwarder import pymongo 

接下来,修复你的参数,一方面,服务器连接,另一方面,为了mongodb连接

 SERVER_HOST = "your.server.host.com" SERVER_USER = "yourserverusername" SERVER_PASS = "yourseverpassword" MONGO_DB = "your_database_name" MONGO_PORT = 27017 

现在您必须通过sshlogin到服务器。

 ssh_connection = SSHTunnelForwarder( SERVER_HOST, ssh_username=SERVER_USER, ssh_password=SERVER_PASS, remote_bind_address=("localhost", MONGO_PORT) #localhost:27017 is mongodb url into server ) ssh_connection.start() #Start connection, you now are connected to server via ssh. 

一旦通过ssh连接,您必须创build连接到mongodb到泊坞窗。 值得说的是,尽pipe服务器中的27017端口绑定到了27017容器中的27017端口,但是仍然要将您的一台主机端口绑定到27017服务器端口。 对象ssh_connection为您提供了一个本地端口,该端口绑定了您在remote_bind_address参数中作为MONGO_PORT实现的端口。 这可以让你一路解锁到mongodb地址到docker中。

 print(ssh_connection.local_bind_port) #When you start, mongodb is assigned to a local port for this connection, so this is the port you must use client = pymongo.MongoClient('127.0.0.1:{}'.format(ssh_connection.local_bind_port)) 

现在,你可以做任何你想要的数据库。 在这种情况下,我执行原始post的例子类似的行为。

 db = client[MONGO_DB] cursor=db[MONGO_DB].find({}) for r in cursor: print(r) print(cursor.count()) 

一旦你完成了所有的任务到数据库中,你必须closuresssh会话。

 ssh_connection.stop() #End ssh connection 

这就是所有人!