Avec la popularité de la technologie de conteneurisation, Docker est devenue la plateforme privilégiée pour le développement et le déploiement de nombreuses applications cloud natives. L'un des scénarios d'application courants est l'interaction entre le conteneur et des ressources externes, telles que le téléchargement et le téléchargement de fichiers, etc. Mais parfois, lorsque vous utilisez un conteneur Docker pour télécharger des fichiers, vous constaterez peut-être que le flux du fichier ne peut pas être lu. Cet article explique pourquoi cela se produit et comment y remédier.
1. Description du problème
Lorsque j'ai utilisé le conteneur Docker pour télécharger des fichiers, j'ai constaté que le téléchargement avait réussi, mais il y avait un problème lors de la lecture du flux de fichiers et le flux de fichiers était vide. J'ai essayé diverses méthodes, notamment la lecture de fichiers locaux et la lecture de fichiers à distance, mais je ne parviens pas à le résoudre. Voici mon exemple de code :
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)
Lorsque vous utilisez la commande curl
pour télécharger un fichier, vous pouvez voir que le téléchargement est réussi, mais lors de la lecture du flux du fichier, il est vide : 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
pour copier le fichier dans le conteneur à des fins de test. On peut constater qu'il n'y a aucun problème avec la lecture du flux de fichiers. Le problème ne vient donc évidemment pas du code qui lit le flux de fichiers. --privileged
pour exécuter le conteneur 🎜🎜🎜Activez le mode privilégié, cela c'est-à-dire, utilisez --privileged pour exécuter le conteneur. Cette option donnera au conteneur un accès root à l'hôte. 🎜$ docker run -d -p 5000:5000 -v /path/to/host/drive:/path/to/container/drive my-image
--tmpfs /path/to/tmpfs:rw
🎜🎜🎜Utilisez --tmpfs
pour monter le fichier temporaire système de fichiers, qui peut garantir que le fichier téléchargé peut être lu correctement. 🎜$ 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!