【问题标题】:How can I make a dockerized Flask app write output to file?如何使 dockerized Flask 应用程序将输出写入文件?
【发布时间】:2018-04-27 11:06:49
【问题描述】:

我正在尝试使托管(dockerized)Flask 应用程序“记录”发送给它的请求的服务器,只需将它们写入文本文件即可。

我的docker-compose.yml 看起来像

version: '2'

services:
  writer:
    build: writer/
    ports: 
      - 5000:5000
    container_name: writer

writer 目录中,我有如下writer.py 文件,它应该获取请求并将其写入本地文件feedback.txt

from flask import Flask, request, jsonify

app = Flask(__name__, static_url_path='')

@app.route('/feedback', methods=['POST']) 
def log_feedback():
    with open("feedback.txt","a") as fo:
        fo.write(request.data.decode("utf-8"))
        print(request.data.decode("utf-8"))
        fo.write('\n')
    return 'Got it!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug = False)

作为参考,我在同一个writer 目录中的Dockerfile 是:

FROM python:3.6-slim
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
ENTRYPOINT [ "python", "writer.py" ]

requirements.txt简直就是

flask

一个示例请求是

curl -H "Content-Type:application" -X POST -d '{"Content":"Hello world"}' http://0.0.0.0:5000/feedback

不幸的是,没有feedback.txt 被写入本地(例如在容器外部)。你能提示我应该执行的修改吗?在docker-compose.yml 中(例如,使用卷?)以便在服务器上写入和访问feedback.txt

【问题讨论】:

  • 你可以试试open("/app/feedback.txt","a") 吗?
  • 谢谢!我试过这样做,但writer 目录中的feedback.txt 没有被修改:(
  • 如果您没有指定任何卷,则容器内的数据不会映射到主机。 You should specify a volume 在你的 docker-compose 文件中。

标签: python docker flask docker-compose


【解决方案1】:

您必须在 docker-compose.yml 中添加一个卷。容器中的路径应包含包含写入文件的文件夹。本地文件夹的路径应包含系统上您要查看写入文件的文件夹。

version: '2'

services:
  writer:
    build: writer/
    ports: 
      - 5000:5000
    container_name: writer
    volumes:
      - /PATH/TO/YOUR/LOCAL_FOLDER:/PATH/TO/FOLDER/IN/CONTAINER

【讨论】:

  • 好的,我通过在 Python 代码中设置:open("/app/feedback.txt","a") 来实现它,正如 cmets 中的 @vitr 所建议的那样; - /PATH/TO/MY/LOCAL_FOLDER:/app 在您提到的 docker-compose 配置中的卷中。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多