在docker集装箱中,连接到在另一个docker集装箱运行的mongodb auth由pymongo失败

我正在使用同一个泊坞窗图像运行两个名叫A和B的docker集装箱。

运行mongodb repl set服务器的A容器,我可以通过以下命令在容器和物理机器上访问它:

mongo 172.17.0.2:27020 -u admin -p admin --authenticationDatabase admin 

我也可以通过pymongo在容器和物理机器上使用它:

 hosts = "172.17.0.2:27018,172.17.0.2:27019,172.17.0.2:27020" extra_args = {"w": 1, "j": True} mongo_client = pymongo.MongoClient(hosts, replicaset="mongo_shard1", **extra_args) mongo_client.get_database("admin").authenticate( "admin", "admin", mechanism='SCRAM-SHA-1') 

但是,在B容器上,我只能通过下面的命令访问一个容器的mongodb服务器:

 mongo 172.17.0.2:27020 -u admin -p admin --authenticationDatabase admin 

如果我使用上面的pymongo,我得到下面的错误:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 1048, in authenticate connect=True) File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 505, in _cache_credentials sock_info.authenticate(credentials) File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 523, in authenticate auth.authenticate(credentials, self) File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 470, in authenticate auth_func(credentials, sock_info) File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 201, in _authenticate_scram_sha1 res = sock_info.command(source, cmd) File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 419, in command collation=collation) File "/usr/local/lib/python2.7/dist-packages/pymongo/network.py", line 116, in command parse_write_concern_error=parse_write_concern_error) File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 210, in _check_command_response raise OperationFailure(msg % errmsg, code, response) pymongo.errors.OperationFailure: Authentication failed. 

它是有线的! 我不知道如何解决它。

Dockerfile如下:

 FROM registry.cn-hangzhou.aliyuncs.com/ubuntu-14-04/ubuntu14.04 MAINTAINER yawei:xdjm562@qq.com ENV MONGODIR /data/mongodb USER root RUN mkdir /data $MONGODIR $MONGODIR/scripts COPY . $MONGODIR/scripts WORKDIR $MONGODIR/scripts RUN sh ubuntu_apt_config.sh # add mongo-org3.0 into apt list RUN apt-get install -y mongodb-org RUN apt-get install -y python-pip RUN pip install pymongo RUN sh create_key.sh mongo.key #generate base64 key by openssl COPY create_local_shard_docker.sh /usr/bin/create_local_shard_docker # create repl set and tail log to avoid container exit CMD sh create_local_shard_docker.sh && tail -f /data/mongodb/logs/mongo_shard1_27020/mongod.log 

create_local_shard_docker.sh如下所示:

 #!/bin/bash for port in 27018 27019 27020 do extra_opts="" if [ "${port}" = "27020" ]; then extra_opts="--other-repl-hosts 127.0.0.1:27018,127.0.0.1:27019" fi python ./create.py --ip 127.0.0.1 --no-bind --port ${port} --name mongo_shard1 ${extra_opts} done 

该文件create.py太长,我认为这是没有问题的。

我不知道问题是mongo的还是docker's或pymongo的…

不pipe怎么说,还是要谢谢你。

PS:

python:2.7.6

pymongo:3.4

MongoDB的:3.0

泊坞窗:17.05.0策