> 운영 및 유지보수 > Docker > Docker 업로드 파일 스트림을 읽을 수 없는 문제를 해결하는 방법

Docker 업로드 파일 스트림을 읽을 수 없는 문제를 해결하는 방법

PHPz
풀어 주다: 2023-03-31 18:39:13
원래의
1452명이 탐색했습니다.

컨테이너화 기술의 인기로 인해 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 做为上传文件的临时存储目录。而可能出现的原因是,容器内部的文件系统隔离导致上传的文件不能被读取。

三、解决方法

解决该问题需要使用三种方法中的任意一种:

  1. 使用 --privileged 运行容器

启用特权模式,即使用 --privileged 运行容器。这个选项会让容器拥有主机的 root 权限。

$ docker run --privileged -d -p 5000:5000 my-image
로그인 후 복사
  1. 使用 --tmpfs /path/to/tmpfs:rw 选项

使用 --tmpfs

$ docker run -d -p 5000:5000 --tmpfs /tmp:rw my-image
로그인 후 복사
2. 문제 분석
  1. 컨테이너 내부에서 docker cp 명령을 사용하여 파일을 컨테이너에 복사해 테스트해 보면 파일 스트림 읽기에는 문제가 없는 것을 확인할 수 있습니다. 따라서 문제는 분명히 파일 스트림을 읽는 코드에 있는 것이 아닙니다.
일부 정보를 확인한 결과 Docker는 업로드된 파일을 처리할 때 업로드된 파일의 임시 저장 디렉터리로 TempFS를 사용한다는 것을 발견했습니다. 가능한 이유는 컨테이너 내부의 파일 시스템 격리로 인해 업로드된 파일을 읽을 수 없기 때문입니다.

3. 솔루션

이 문제를 해결하려면 다음 세 가지 방법 중 하나를 사용해야 합니다.

    --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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿