Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So lösen Sie das Problem, dass der Docker-Upload-Dateistream nicht gelesen werden kann

So lösen Sie das Problem, dass der Docker-Upload-Dateistream nicht gelesen werden kann

PHPz
PHPzOriginal
2023-03-31 18:38:541367Durchsuche

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

三、解决方法

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

  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. Problemanalyse
  1. Innerhalb des Containers können Sie den Befehl 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.
Ich habe einige Informationen überprüft und festgestellt, dass Docker bei der Verarbeitung hochgeladener Dateien TempFS als temporäres Speicherverzeichnis für hochgeladene Dateien verwendet. Der mögliche Grund ist, dass die Dateisystemisolation innerhalb des Containers verhindert, dass die hochgeladene Datei gelesen werden kann.

3. Lösung

Um dieses Problem zu lösen, müssen Sie eine der drei Methoden verwenden:

    Verwenden Sie --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
      🎜Verwenden Sie die Option --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.
      🎜🎜Mounten Sie das lokale Verzeichnis direkt im Container.🎜🎜🎜Mounten Sie das Verzeichnis im Host-Dateisystem direkt unter einem bestimmten Pfad im Container, sodass die hochgeladenen Dateien sowohl innerhalb als auch außerhalb des Containers korrekt gelesen werden können. 🎜rrreee🎜Verwenden Sie eine der oben genannten Methoden und laden Sie den Test erneut hoch. Sie können sehen, dass sowohl das Hochladen als auch das Lesen des Dateistreams erfolgreich waren: 🎜rrreee🎜Kurz gesagt, der Dateisystem-Isolationsmechanismus von Docker führt manchmal dazu, dass die hochgeladene Datei nicht korrekt gelesen wird , aber es gibt Die oben genannten drei Lösungen sind verfügbar. Ich hoffe, dieser Artikel kann Ihnen bei den Problemen helfen, die bei der Verwendung von Docker-Anwendungen auftreten. 🎜

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn