我有一个基于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
使用命令运行
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()
最佳答案
您可能没有来自容器的互联网连接。从容器化的Java应用程序连接到公共(public)Web服务时,我遇到了类似的问题。
首先,我会尝试重新启动docker:
systemctl restart docker
如果没有帮助,请查看您容器中的resolv.conf:
docker run --rm myflaskimage cat /etc/resolv.conf
如果显示
nameserver 127.x.x.x
,则可以尝试:1)在主机系统上的/etc/NetworkManager/NetworkManager.conf文件中用
dns=dnsmasq
注释#
行,并使用systemctl restart network-manager
重新启动NetworkManager2)或为docker明确设置DNS,将其添加到/etc/docker/daemon.json文件中并重新启动docker:
{
"dns": ["my.dns.server"]
}