Maison  >  Article  >  Opération et maintenance  >  Comment résoudre le problème selon lequel le flux de fichiers de téléchargement Docker ne peut pas être lu

Comment résoudre le problème selon lequel le flux de fichiers de téléchargement Docker ne peut pas être lu

PHPz
PHPzoriginal
2023-03-31 18:38:541412parcourir

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 做为上传文件的临时存储目录。而可能出现的原因是,容器内部的文件系统隔离导致上传的文件不能被读取。

三、解决方法

解决该问题需要使用三种方法中的任意一种:

  1. 使用 --privileged 运行容器

启用特权模式,即使用 --privileged 运行容器。这个选项会让容器拥有主机的 root 权限。

$ docker run --privileged -d -p 5000:5000 my-image
  1. 使用 --tmpfs /path/to/tmpfs:rw 选项

使用 --tmpfs

$ docker run -d -p 5000:5000 --tmpfs /tmp:rw my-image
2. Analyse du problème
  1. À l'intérieur du conteneur, vous pouvez utiliser la commande 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.
J'ai vérifié certaines informations et découvert que Docker utilise TempFS comme répertoire de stockage temporaire pour les fichiers téléchargés lors du traitement des fichiers téléchargés. La raison possible est que l'isolation du système de fichiers à l'intérieur du conteneur empêche la lecture du fichier téléchargé.

3. Solution

Pour résoudre ce problème, vous devez utiliser l'une des trois méthodes :

    Utilisez --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
      🎜Utilisez l'option --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.
      🎜🎜Montez directement le répertoire local sur le conteneur🎜🎜🎜Montez directement le répertoire dans le système de fichiers hôte sur un certain chemin dans le conteneur, afin que les fichiers téléchargés puissent être lus correctement à la fois à l'intérieur et à l'extérieur du conteneur. 🎜rrreee🎜Utilisez l'une des méthodes ci-dessus et téléchargez à nouveau le test. Vous pouvez voir que le téléchargement et la lecture du flux de fichiers réussissent : 🎜rrreee🎜En bref, le mécanisme d'isolation du système de fichiers de Docker empêche parfois la lecture correcte du fichier téléchargé. , mais il existe Les trois solutions ci-dessus sont disponibles. J'espère que cet article pourra vous aider à résoudre les problèmes que vous rencontrez lors de l'utilisation des applications Docker. 🎜

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn