컨테이너화 기술의 인기로 인해 Docker는 많은 클라우드 네이티브 애플리케이션의 개발 및 배포에 선호되는 플랫폼이 되었습니다. 일반적인 애플리케이션 시나리오 중 하나는 파일 업로드 및 다운로드 등과 같은 컨테이너와 외부 리소스 간의 상호 작용입니다. 그러나 때때로 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
命令上传文件时,可以看到上传成功了,但读取文件流时却为空:
$ 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
命令将文件复制到容器内部进行测试,可以发现文件流读取没有问题。所以问题显然不是出在读取文件流的代码上面。
我查阅了一些资料,发现 Docker 在处理上传文件时,会使用 TempFS 做为上传文件的临时存储目录。而可能出现的原因是,容器内部的文件系统隔离导致上传的文件不能被读取。
三、解决方法
解决该问题需要使用三种方法中的任意一种:
--privileged
运行容器启用特权模式,即使用 --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 cp
명령을 사용하여 파일을 컨테이너에 복사해 테스트해 보면 파일 스트림 읽기에는 문제가 없는 것을 확인할 수 있습니다. 따라서 문제는 분명히 파일 스트림을 읽는 코드에 있는 것이 아닙니다. --privileged
를 사용하여 컨테이너를 실행합니다. 🎜🎜🎜권한 모드를 활성화합니다. 즉, --privileged를 사용하여 컨테이너를 실행합니다. 이 옵션은 컨테이너에 호스트에 대한 루트 액세스 권한을 부여합니다. 🎜$ docker run -d -p 5000:5000 -v /path/to/host/drive:/path/to/container/drive my-image
--tmpfs /path/to/tmpfs:rw
옵션을 사용하세요. 🎜🎜🎜임시 파일을 마운트하려면 --tmpfs
를 사용하세요. 파일 시스템은 업로드된 파일을 올바르게 읽을 수 있도록 보장합니다. 🎜$ 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!