コンテナ化テクノロジーの人気により、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 -
docker cp コマンドを使用して、テスト用にファイルをコンテナ内にコピーできます。ファイルストリームの読み取りに問題がないことを確認します。したがって、問題は明らかにファイル ストリームを読み取るコードにあるわけではありません。
を使用してコンテナを実行します。このオプションにより、コンテナーにホストへの root アクセスが付与されます。
$ docker run --privileged -d -p 5000:5000 my-image
--tmpfs /path/to/tmpfs:rw オプション
マウント一時ファイル システムにより、アップロードされたファイルが正しく読み取れることが保証されます。
$ 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アップロードファイルストリームが読み込めない問題の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。