dockerアップロードファイルストリームが読み込めない問題の解決方法

PHPz
リリース: 2023-03-31 18:39:13
オリジナル
1423 人が閲覧しました

コンテナ化テクノロジーの人気により、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 コマンドを使用して、テスト用にファイルをコンテナ内にコピーできます。ファイルストリームの読み取りに問題がないことを確認します。したがって、問題は明らかにファイル ストリームを読み取るコードにあるわけではありません。

いくつかの情報を確認したところ、Docker はアップロードされたファイルを処理するときに、アップロードされたファイルの一時保存ディレクトリとして TempFS を使用することがわかりました。考えられる理由は、コンテナ内のファイル システムが分離されているため、アップロードされたファイルが読み取れないことが考えられます。

3. 解決策

この問題を解決するには、次の 3 つの方法のいずれかを使用する必要があります。 run Container

    は特権モードを有効にします。つまり、
  1. --privileged を使用してコンテナを実行します。このオプションにより、コンテナーにホストへの root アクセスが付与されます。
    $ docker run --privileged -d -p 5000:5000 my-image
    ログイン後にコピー
使用

--tmpfs /path/to/tmpfs:rw オプション

    使用
  1. --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
ログイン後にコピー
    上記の方法のいずれかを使用して、テストを再度アップロードします。ファイル ストリームのアップロードと読み取りの両方が成功していることがわかります:
  1. $ 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.
    ログイン後にコピー
  2. つまり、Docker のファイル システム分離メカニズムにより、場合によっては、アップロードするファイルが正しく読み込めないのですが、解決方法は上記の3つです。この記事が、Docker アプリケーションの使用時に発生する問題の解決に役立つことを願っています。

以上がdockerアップロードファイルストリームが読み込めない問題の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート