Docker容器无法连接到远程MongoDB

S A*_*rew 8 mongodb flask python-3.x docker

我有一个flask基于python的代码,只需连接到.mongodb它有两个路由Get Post.Get简单地打印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
Run Code Online (Sandbox Code Playgroud)

使用命令运行

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

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

pymongo.errors.ServerSelectionTimeoutError: No servers found yet
Run Code Online (Sandbox Code Playgroud)

我有点困惑为什么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()
Run Code Online (Sandbox Code Playgroud)

cgr*_*rim 1

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

首先我会尝试重新启动docker:

systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm myflaskimage cat /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

如果显示,nameserver 127.x.x.x那么您可以尝试:

1) 在/etc/NetworkManager/NetworkManager.conf文件中的主机系统注释dns=dnsmasq行上添加 a并使用以下命令重新启动 NetworkManager#systemctl restart network-manager

2) 或显式设置 docker 的 DNS,将其添加到/etc/docker/daemon.json文件中并重新启动 docker:

{
    "dns": ["my.dns.server"]
}
Run Code Online (Sandbox Code Playgroud)