【发布时间】:2018-08-21 08:12:41
【问题描述】:
我有一个基于flask 的python 代码,它简单地连接到mongodb。它有两条路由GetPost。 Get 只是打印hello world 并使用Post 我们可以发布任何后来保存在MongoDB 中的json 数据这个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()
【问题讨论】:
-
mongo 在哪里运行?容器可以连接到它吗?你在那里使用什么主机名?
-
@Thilo
MongoDB托管在云上。仅运行 python 代码并在本地主机上执行 Post 时,一切正常,但从容器端执行相同操作时,会显示错误。如何检查容器是否连接到 mongo。? -
你能在容器中启动一个shell并使用
mongo命令行客户端吗? -
@Thilo 我试过并运行
mongo命令行clinet,但它说找不到可能是因为在Dockerfile中我刚刚安装了pymongo这是mongodb 的python 模块。有没有其他方法可以尝试从容器内连接到 mongodb -
容器和你的本地环境是否使用相同版本的
pymongo?
标签: python-3.x mongodb docker flask