Mit der Popularität der Containerisierungstechnologie ist Docker zur bevorzugten Plattform für die Entwicklung und Bereitstellung vieler Cloud-nativer Anwendungen geworden. Eines der häufigsten Anwendungsszenarien ist die Interaktion zwischen dem Container und externen Ressourcen, beispielsweise das Hoch- und Herunterladen von Dateien usw. Wenn Sie jedoch einen Docker-Container zum Hochladen von Dateien verwenden, kann es vorkommen, dass der Dateistream nicht gelesen werden kann. In diesem Artikel erfahren Sie, warum dies geschieht und wie Sie es beheben können.
1. Problembeschreibung
Als ich den Docker-Container zum Hochladen von Dateien verwendete, stellte ich fest, dass der Upload erfolgreich war, aber beim Lesen des Dateistreams ein Problem auftrat und der Dateistream leer war. Ich habe verschiedene Methoden ausprobiert, darunter das lokale Lesen von Dateien und das Lesen von Remote-Dateien, konnte das Problem jedoch nicht lösen. Das Folgende ist mein Codebeispiel:
import io from datetime import datetime from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload_file(): f = request.files['file'] stream = io.StringIO() stream.write(f.stream.read()) stream.seek(0) print(stream.read()) return jsonify({'success': True}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
Wenn Sie den Befehl curl
zum Hochladen einer Datei verwenden, können Sie sehen, dass der Upload erfolgreich war, aber beim Lesen des Dateistreams ist dieser leer: curl
命令上传文件时,可以看到上传成功了,但读取文件流时却为空:
$ curl -X POST -F "file=@test.txt" http://localhost:5000/upload {"success": true} $ python app.py 2019-12-26 16:10:10,990 - INFO - * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 2019-12-26 16:10:16,930 - INFO -
二、问题分析
在容器内部,可以通过 docker cp
命令将文件复制到容器内部进行测试,可以发现文件流读取没有问题。所以问题显然不是出在读取文件流的代码上面。
我查阅了一些资料,发现 Docker 在处理上传文件时,会使用 TempFS 做为上传文件的临时存储目录。而可能出现的原因是,容器内部的文件系统隔离导致上传的文件不能被读取。
三、解决方法
解决该问题需要使用三种方法中的任意一种:
--privileged
运行容器启用特权模式,即使用 --privileged
运行容器。这个选项会让容器拥有主机的 root 权限。
$ docker run --privileged -d -p 5000:5000 my-image
--tmpfs /path/to/tmpfs:rw
选项使用 --tmpfs
$ docker run -d -p 5000:5000 --tmpfs /tmp:rw my-image
docker cp
verwenden, um die Datei zum Testen in den Container zu kopieren. Es kann festgestellt werden, dass beim Lesen des Dateistreams kein Problem vorliegt. Das Problem liegt also offensichtlich nicht beim Code, der den Dateistream liest. --privileged
, um den Container auszuführen. 🎜🎜🎜Aktivieren Sie den privilegierten Modus Das heißt, mit --privileged wird der Container ausgeführt. Diese Option gewährt dem Container Root-Zugriff auf den Host. 🎜$ docker run -d -p 5000:5000 -v /path/to/host/drive:/path/to/container/drive my-image
--tmpfs /path/to/tmpfs:rw
🎜🎜🎜Verwenden Sie --tmpfs
, um das Temporäre bereitzustellen Dateisystem, das sicherstellen kann, dass die hochgeladene Datei korrekt gelesen werden kann. 🎜$ curl -X POST -F "file=@test.txt" http://localhost:5000/upload {"success": true} $ python app.py 2019-12-26 16:55:01,697 - INFO - * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 2019-12-26 16:55:03,428 - INFO - This is a test file.
Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem, dass der Docker-Upload-Dateistream nicht gelesen werden kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!