コンテナ化テクノロジーの人気により、Docker は多くのクラウドネイティブ アプリケーションの開発と展開に推奨されるプラットフォームになりました。一般的なアプリケーション シナリオの 1 つは、ファイルのアップロードやダウンロードなど、コンテナーと外部リソース間の対話です。ただし、Docker コンテナを使用してファイルをアップロードする場合、ファイル ストリームを読み取れない場合があります。この記事では、この問題が発生する理由とその解決方法について説明します。
1. 問題の説明
Docker コンテナを使用してファイルをアップロードしたところ、アップロードは成功しましたが、ファイル ストリームの読み取り時に問題が発生し、ファイル ストリームが空の。ローカルファイル読み込みやリモートファイル読み込みなど色々試しましたが解決できません。以下は私のコード例です:
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)
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 -2. 問題分析 コンテナ内では、
docker cp コマンドを使用して、テスト用にファイルをコンテナ内にコピーできます。ファイルストリームの読み取りに問題がないことを確認します。したがって、問題は明らかにファイル ストリームを読み取るコードにあるわけではありません。
- は特権モードを有効にします。つまり、
- --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 run -d -p 5000:5000 -v /path/to/host/drive:/path/to/container/drive my-image
- 上記の方法のいずれかを使用して、テストを再度アップロードします。ファイル ストリームのアップロードと読み取りの両方が成功していることがわかります:
$ 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.
つまり、Docker のファイル システム分離メカニズムにより、場合によっては、アップロードするファイルが正しく読み込めないのですが、解決方法は上記の3つです。この記事が、Docker アプリケーションの使用時に発生する問題の解決に役立つことを願っています。
以上がdockerアップロードファイルストリームが読み込めない問題の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

実際のプロジェクトのDockerのアプリケーションシナリオには、展開の簡素化、マルチコンテナーアプリケーションの管理、パフォーマンスの最適化が含まれます。 1.Dockerは、dockerfileを使用してnode.jsアプリケーションを展開するなど、アプリケーションの展開を簡素化します。 2。DockerComposeは、マイクロサービスアーキテクチャのWebやデータベースサービスなどのマルチコンテナーアプリケーションを管理しています。 3.パフォーマンス最適化は、マルチステージ構造を使用して画像サイズを縮小し、健康チェックを通じてコンテナのステータスを監視します。

小さなプロジェクトまたは開発環境でDockerを選択し、大規模なプロジェクトまたは生産環境でKubernetesを選択します。 1.ドッカーは、迅速な反復とテストに適しています。2。Kubernetesは、大規模なアプリケーションの管理と拡張に適した強力なコンテナオーケストレーション機能を提供します。

Linuxは、豊富なツールとコミュニティサポートを提供するネイティブプラットフォームであるため、LinuxでDockerが重要です。 1. docker:sudoapt-getupdateとsudoapt-getinstalldocker-cedocker-ce-clicotainerd.ioを使用します。 2。コンテナの作成と管理:Dockerrun-D-Namemynginx-P80:80NginxなどのDockerrunコマンドを使用します。 3。DockerFileを書き込み:画像サイズを最適化し、マルチステージ構造を使用します。 4。最適化とデバッグ:DockerLogsとDockerexを使用します

Dockerはコンテナ化ツールであり、Kubernetesはコンテナオーケストレーションツールです。 1. Dockerパッケージアプリケーションとその依存関係は、Docker対応環境で実行できるコンテナに依存します。 2。Kubernetesはこれらのコンテナを管理し、自動展開、スケーリング、管理を実装し、アプリケーションを効率的に実行します。

Dockerの目的は、アプリケーションの展開を簡素化し、コンテナ化技術を通じてさまざまな環境でアプリケーションが一貫して実行されるようにすることです。 1)Dockerは、アプリケーションと依存関係をコンテナにパッケージ化することにより、環境の違いの問題を解決します。 2)DockerFileを使用して画像を作成して、アプリケーションがどこでも一貫して実行されることを確認します。 3)Dockerの作業原則は画像とコンテナに基づいており、Linuxカーネルの名前空間とコントロールグループを使用して、分離とリソース管理を実現します。 4)基本的な使用法には、DockerHubからの画像の引き込みと実行が含まれます。高度な使用法には、DockerComposeを使用したマルチコンテナーアプリケーションの管理が含まれます。 5)画像構築の故障やコンテナの障害などの一般的なエラーは、ログやネットワーク構成を介してデバッグできます。 6)パフォーマンス最適化構造

Ubuntu、Centos、およびDebianにDockerをインストールして使用する方法は異なります。 1)ubuntu:aptパッケージマネージャーを使用します。コマンドはsudoapt-getupdate && sudoapt-getinstalldocker.ioです。 2)Centos:Yum Package Managerを使用すると、Dockerリポジトリを追加する必要があります。コマンドは、sudoyumininstall-yyum-utils && sudoyum-config-manager - add-repohttps://download.docker.com/linです

LinuxでDockerを使用すると、開発効率が向上し、アプリケーションの展開を簡素化できます。 1)Ubuntu画像を引く:dockerpullubuntu。 2)ubuntuコンテナを実行:Dockerrun-itubuntu/bin/bash。 3)nginxを含むDockerFileを作成します:fromubuntu; runapt-getupdate && apt-getinstall-ynginx; expose80。 4)画像の作成:dockerbuild-tmy-nginx。 5)コンテナの実行:Dockerrun-D-P8080:80

Dockerは、Linuxのアプリケーションの展開と管理を簡素化します。 1)Dockerは、アプリケーションとその依存関係を軽量でポータブルコンテナにパッケージ化するコンテナ化されたプラットフォームです。 2)Linuxでは、DockerはCgroupと名前空間を使用して、コンテナの分離とリソース管理を実装します。 3)基本的な使用には、画像の引き込みと実行容器が含まれます。 DockerComposeなどの高度な使用は、マルチコンテナーアプリケーションを定義できます。 4)一般的に使用されるDockerLogsとDockerexecコマンドをデバッグします。 5)パフォーマンスの最適化は、マルチステージの構造により画像サイズを縮小することができ、DockerFileをシンプルに保つことがベストプラクティスです。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
