Dengan populariti teknologi kontena, Docker telah menjadi platform pilihan untuk pembangunan dan penggunaan banyak aplikasi asli awan. Salah satu senario aplikasi biasa ialah interaksi antara bekas dan sumber luaran, seperti memuat naik dan memuat turun fail, dsb. Tetapi kadangkala apabila menggunakan bekas Docker untuk memuat naik fail, anda mungkin mendapati bahawa aliran fail tidak boleh dibaca. Artikel ini akan meneroka sebab ini berlaku dan cara membetulkannya.
1. Penerangan Masalah
Apabila saya menggunakan bekas Docker untuk memuat naik fail, saya mendapati muat naik berjaya, tetapi terdapat masalah semasa membaca strim fail dan aliran fail adalah kosong. Saya telah mencuba pelbagai kaedah, termasuk menggunakan pembacaan fail tempatan dan pembacaan fail jauh, tetapi tidak dapat menyelesaikannya. Berikut ialah contoh kod saya:
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)
Apabila menggunakan perintah curl
untuk memuat naik fail, anda boleh melihat bahawa muat naik berjaya, tetapi apabila membaca aliran fail ia kosong:
$ 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. Analisis Masalah
Di dalam bekas, anda boleh menggunakan perintah docker cp
untuk menyalin fail ke bahagian dalam bekas untuk ujian dengan bacaan aliran fail. Jadi masalahnya jelas bukan dengan kod yang membaca aliran fail.
Saya menyemak beberapa maklumat dan mendapati Docker akan menggunakan TempFS sebagai direktori storan sementara untuk fail yang dimuat naik semasa memproses fail yang dimuat naik. Sebab yang mungkin ialah pengasingan sistem fail di dalam bekas menghalang fail yang dimuat naik daripada dibaca.
3. Penyelesaian
Untuk menyelesaikan masalah ini, anda perlu menggunakan mana-mana daripada tiga kaedah:
--privileged
untuk menjalankan bekasDayakan mod istimewa, iaitu gunakan --privileged
untuk menjalankan bekas. Pilihan ini akan memberikan akses akar kontena kepada hos.
$ docker run --privileged -d -p 5000:5000 my-image
--tmpfs /path/to/tmpfs:rw
Gunakan --tmpfs
untuk memasang sistem fail sementara bagi memastikan fail yang dimuat naik boleh dibaca dengan betul.
$ docker run -d -p 5000:5000 --tmpfs /tmp:rw my-image
Lekapkan direktori secara terus dalam sistem fail hos ke laluan tertentu bekas, yang boleh membuat dalam dan luar bekas Semua fail yang dimuat naik boleh dibaca dengan betul.
$ docker run -d -p 5000:5000 -v /path/to/host/drive:/path/to/container/drive my-image
Gunakan mana-mana kaedah di atas dan muat naik ujian sekali lagi Anda boleh melihat bahawa kedua-dua muat naik dan membaca strim fail berjaya:
$ 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.
Ringkasnya, sistem fail Docker. mekanisme pengasingan kadangkala Ini akan menyebabkan fail yang dimuat naik tidak dibaca dengan betul, tetapi terdapat tiga penyelesaian di atas. Saya harap artikel ini dapat membantu anda dengan masalah yang anda hadapi semasa menggunakan aplikasi Docker.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah bahawa aliran fail muat naik docker tidak boleh dibaca. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!