从运行在Docker容器中的Flask应用程序中下载文件

时间:2018-12-11 13:47:51

标签: python docker flask

我正在制作一个在Docker容器中运行的Flask应用程序。到目前为止,一切工作正常,但是现在我想创建一个GET方法,该方法应该返回一个文件,供用户下载。为此,我尝试了Flask函数send_filesend_from_directory。当我按原样运行我的应用程序时,它们都可以工作,但是一旦将其放入Docker容器中,一切就会停止。

如果我使用send_file,则会收到file not found错误,尽管我可以使用相同的文件路径调用print(os.path.isfile),但它会显示。

如果我使用send_from_directory使用正确的路径和文件名,则会收到404错误。

同样,仅在从Docker容器运行时才这样做。可能是权限问题?

方法示例:

class DownloadLog(Resource):
    def get(self):
        print(os.path.isfile('logfile.log')  # Returns 'True'
        return send_from_directory('.', 'logfile.log')

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,当应用程序在容器中运行时,我通过传递完整文件路径而不是相对路径来解决此问题。

例如,当我只运行烧瓶时,我可以使用类似的东西:

send_from_directory(
    current_app.config["DOWNLOAD_FOLDER"], filename.jpg, as_attachment=True
)

但是,如果在容器中运行应用程序,则需要将其更改为:

send_from_directory(
    os.path.join(os.getcwd(), current_app.config["DOWNLOAD_FOLDER"]),
    filename.jpg,
    as_attachment=True,
)

基本上os.getcwd()是在Dockerfile或docker-compose.yml文件中定义的应用程序根文件夹。

答案 1 :(得分:0)

尽管要回答这个问题将近一年,

按原样执行flask_application并使用send_from_directory(directory/path, filename, as_attachment=True)时,它将从HOST OS文件系统(Windows,Linux,macOS)发送文件。

当您在docker容器中执行flask_application并使用send_from_directory(directory/path, filename, as_attachment=True)时,它将从您的WORKDIR (/app)发送文件。由于flask在WORKDIR中找不到文件,因此报告404。

如果您希望它在docker中工作,则可以ADD or COPY send_from_directory您要用户下载的文件,然后在{{1}}中使用其路径,或者也可以使用卷。

希望有帮助!

PS:今天我经历了同样的事情!