Heim Betrieb und Instandhaltung Docker 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

Mar 31, 2023 pm 06:38 PM

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)
Nach dem Login kopieren

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 -
Nach dem Login kopieren

二、问题分析

在容器内部,可以通过 docker cp 命令将文件复制到容器内部进行测试,可以发现文件流读取没有问题。所以问题显然不是出在读取文件流的代码上面。

我查阅了一些资料,发现 Docker 在处理上传文件时,会使用 TempFS 做为上传文件的临时存储目录。而可能出现的原因是,容器内部的文件系统隔离导致上传的文件不能被读取。

三、解决方法

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

  1. 使用 --privileged 运行容器

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

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

使用 --tmpfs

$ docker run -d -p 5000:5000 --tmpfs /tmp:rw my-image
Nach dem Login kopieren
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
    Nach dem Login kopieren
      🎜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.
      Nach dem Login kopieren
      🎜🎜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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Fragen zum Docker -Interview: Ace Ihr DevOps Engineering Interview Fragen zum Docker -Interview: Ace Ihr DevOps Engineering Interview Apr 06, 2025 am 12:01 AM

Docker ist ein Muss für DevOps-Ingenieure. 1.Docker ist eine Open -Source -Containerplattform, die Isolation und Portabilität durch Verpackung von Anwendungen und deren Abhängigkeiten in Container erreicht. 2. Docker arbeitet mit Namespaces, Kontrollgruppen und föderierten Dateisystemen. 3. Die grundlegende Nutzung beinhaltet das Erstellen, Ausführen und Verwalten von Containern. 4. Erweiterte Verwendung umfasst die Verwendung von DockerComponpose zur Verwaltung von Anwendungen mit mehreren Konten. 5. Zu den häufigen Fehlern gehören Containerausfall, Port -Mapping -Probleme und Datenpersistenzprobleme. Zu den Debugging -Fähigkeiten gehören das Anzeigen von Protokollen, das Eingeben von Containern und das Anzeigen detaillierter Informationen. 6. Leistungsoptimierung und Best Practices umfassen Bildoptimierung, Ressourcenbeschränkungen, Netzwerkoptimierung und Best Practices für die Verwendung von DockerFile.

Docker -Bände: Verwalten anhaltender Daten in Containern Docker -Bände: Verwalten anhaltender Daten in Containern Apr 04, 2025 am 12:19 AM

Dockervolumes stellt sicher, dass Daten sicher bleiben, wenn Container neu gestartet, gelöscht oder migriert werden. 1. Erstellen Sie Volumen: DockervolumecreatemyData. 2. Führen Sie den Container- und Mount-Volumen aus: Dockerrun-it-vmydata:/App/DataUbuntubash. 3. Die erweiterte Nutzung umfasst Datenaustausch und Backup.

Härtung der Docker -Sicherheit: Schutz Ihrer Container vor Schwachstellen Härtung der Docker -Sicherheit: Schutz Ihrer Container vor Schwachstellen Apr 05, 2025 am 12:08 AM

Zu den Methoden zur Verbesserung der Docker Security Enhancement gehören: 1. Verwenden Sie den Parameter-Cap-Drop, um Linux-Funktionen zu begrenzen. Diese Strategien schützen Container, indem sie die Exposition gegenüber der Verwundbarkeit reduzieren und die Fähigkeiten des Angreifers einschränken.

So aktualisieren Sie das Bild von Docker So aktualisieren Sie das Bild von Docker Apr 15, 2025 pm 12:03 PM

Die Schritte zur Aktualisierung eines Docker -Images sind wie folgt: Ziehen Sie das neueste Bild -Tag. Neues Bild Löschen Sie das alte Bild für ein bestimmtes Tag (optional) den Container neu (falls erforderlich) neu starten Sie neu (falls erforderlich).

So verwenden Sie Docker Desktop So verwenden Sie Docker Desktop Apr 15, 2025 am 11:45 AM

Wie benutze ich Docker Desktop? Docker Desktop ist ein Werkzeug zum Ausführen von Docker -Containern auf lokalen Maschinen. Zu den zu verwendenden Schritten gehören: 1.. Docker Desktop installieren; 2. Start Docker Desktop; 3.. Erstellen Sie das Docker -Bild (mit Dockerfile); 4. Build Docker Image (mit Docker Build); 5. Docker -Container ausführen (mit Docker Run).

So kopieren Sie Dateien in Docker nach außen So kopieren Sie Dateien in Docker nach außen Apr 15, 2025 pm 12:12 PM

Methoden zum Kopieren von Dateien in externen Hosts in Docker: Verwenden Sie den Befehl Docker CP: Docker CP [Optionen] & lt; Containerpfad & gt; & lt; Host -Pfad & gt;. Verwenden von Datenvolumina: Erstellen Sie ein Verzeichnis auf dem Host und verwenden Sie den Parameter -V, um das Verzeichnis in den Container zu montieren, um den Container zu erstellen, um eine bidirektionale Dateisynchronisation zu erreichen.

So verlassen Sie den Container mit Docker So verlassen Sie den Container mit Docker Apr 15, 2025 pm 12:15 PM

Vier Möglichkeiten zum Beenden von Docker Container: Verwenden Sie Strg D im Befehl Container Terminal ENGEBOT IM Container Terminal verwenden Sie Docker Stop & lt; container_name & gt; Befehl verwenden Sie Docker Kill & lt; container_name & gt; Befehl im Host -Terminal (Force Exit)

So sehen Sie den Docker -Prozess So sehen Sie den Docker -Prozess Apr 15, 2025 am 11:48 AM

Docker Process Viewing -Methode: 1. Docker Cli -Befehl: Docker PS; 2. SYSTEMD CLI -Befehl: SystemCTL Status Docker; 3.. Docker Compose CLI Command: Docker-Compose PS; 4. Process Explorer (Windows); 5. /proc -Verzeichnis (Linux).

See all articles