컨테이너화 기술의 인기로 인해 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-image2. 문제 분석
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.🎜🎜로컬 디렉터리를 컨테이너에 직접 마운트🎜🎜🎜호스트 파일 시스템의 디렉터리를 컨테이너의 특정 경로에 직접 마운트하면 업로드된 파일을 컨테이너 내부와 외부 모두에서 올바르게 읽을 수 있습니다. 🎜rrreee🎜위 방법 중 하나를 사용하고 테스트를 다시 업로드하면 파일 스트림 업로드와 읽기가 모두 성공한 것을 확인할 수 있습니다. 🎜rrreee🎜간단히 말하면 Docker의 파일 시스템 격리 메커니즘으로 인해 업로드된 파일이 올바르게 읽히지 않는 경우가 있습니다. , 하지만 위의 세 가지 솔루션 중에서 선택할 수 있습니다. 이 글이 Docker 애플리케이션을 사용할 때 직면하는 문제를 해결하는 데 도움이 되기를 바랍니다. 🎜
위 내용은 Docker 업로드 파일 스트림을 읽을 수 없는 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!