Docker容器无法连接到远程MongoDB

时间:2018-08-21 08:12:42

标签: python-3.x mongodb docker flask

我有一个基于flask的python代码,可以简单地连接到mongodb。它有两条路由Get PostGet只需打印hello world,然后使用Post就可以发布任何json数据,然后将其保存在MongoDB中。此python代码可以正常工作。 MongoDB托管在云上。

我现在已经创建了一个Dockerfile:

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7

RUN pip3 install pymongo

ENV LISTEN_PORT=8000
EXPOSE 8000

COPY /app /app

使用命令运行

docker run --rm -it -p 8000:8000 myflaskimage

启动该docker镜像的容器后,我得到了GET的响应,但没有得到POST的响应。我正在使用Postman软件发布json数据。我遇到以下错误:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

我对为什么python代码能正常工作感到困惑,但是当我将相同的代码放入docker并启动容器时,它会引发错误。我们是否必须在Dockerfile中包含任何内容才能启用与MongoDB的连接。

请帮助。谢谢

Python代码:

from flask import Flask, request
from pymongo import MongoClient

app = Flask(__name__)

def connect_db():
    try:
        client = MongoClient(<mongodbURL>)
        return client.get_database(<DBname>)

    except Exception as e:
        print(e)


def main():
    db = connect_db()
    collection = db.get_collection('<collectionName>')

    @app.route('/data', methods=['POST'])
    def data():
        j_data = request.get_json()
        x = collection.insert_one(j_data).inserted_id
        return "Data added successfully"

    @app.route('/')
    def hello_world():
        return "Hello World"

main()

if __name__ == '__main__':
   app.run()

1 个答案:

答案 0 :(得分:1)

您的容器可能没有Internet连接。从容器化的Java应用程序连接到公共Web服务时,我遇到了类似的问题。

起初,我会尝试重新启动docker:

systemctl restart docker

如果这样做没有帮助,请查看您容器中的resolv.conf:

docker run --rm myflaskimage cat /etc/resolv.conf

如果显示nameserver 127.x.x.x,则可以尝试:

1)在主机系统注释dns=dnsmasq行中的 /etc/NetworkManager/NetworkManager.conf 文件中使用#,并使用systemctl restart network-manager重新启动NetworkManager < / p>

2)或为docker明确设置DNS,将其添加到 /etc/docker/daemon.json 文件中,然后重新启动docker:

{
    "dns": ["my.dns.server"]
}