通过在 docker-compose 中将其添加为卷来访问外部驱动器中的数据,然后使用 docker-compose up

Accessing data in an external drive by adding it as a volume in docker-compose, then using docker-compose up

我有一个 docker 容器 运行 一个简单的 python flask 应用程序。这是一个 linux 容器,但我的机器是 windows 机器。我已经通过 USB 连接了一个外部硬盘驱动器,它在 windows 中显示为 E 驱动器。我已通过设置授予 docker 访问 C 和 E 中所有内容的权限。

我想让我的 python 做的就是显示 E 文件夹中的文件夹内容。但是什么也找不到!以前我收到关于文件路径不存在的错误,但我能够修复它。但是,现在它似乎甚至没有在我想要的路径上找到任何内容。我已经看到了如何 运行 一个 docker 容器以体积作为参数的示例,但我 运行 将其与 docker-compose 结合使用。

这是我的 Dockerfile:

FROM python:3
WORKDIR /code
ENV FLASK_APP practice.py
ENV FLASK_RUN_HOST 0.0.0.0
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["flask", "run"]

这是我的 docker-compose 文件:

version: '3'
services:
    web:
        build: .
        ports:
            - "5000:5000"
        volumes:
            - .:/code
            - /mnt/e/folderWithStuff/
        environment:
            FLASK_ENV: development
    redis:
        image: "redis:alpine"

第二卷的路径为 /mnt/e/folderWithStuffInIt 的原因是因为这是我可以从 Window 机器的 Ubuntu 子系统访问的路径。这让我相信从 linux 容器内部访问时它应该是相同的路径。

我点击的端点是这样做的:

@app.route('/list')
def list_files():
    files = os.listdir("/mnt/e/folderWithStuff")
    result = ""

    for file in files:
        result = result + file

    return result

我得到的只是一个空白页。该路线很好,因为如果我将其更改为 return 字符串,我会在该路线上看到该字符串。它不会抱怨该目录,因此该目录中似乎应该有一些东西。它看起来不像是在实际访问我授予它访问权限的外部驱动器中的文件夹。我错过了什么或误解了什么?

我想通了!

在我的 docker-compose 文件中定义的卷部分,您需要创建一个映射!

所以它实际上应该是这样的:

    volumes:
        - .:/code
        - E:\files:/mnt/e/files

您计算机上的路径是 运行 容器必须在 : 符号的左侧表示。右边的路径可以是任何你想要的。您的代码将能够访问右侧的路径,然后映射将使您的代码访问您已连接到主机的 C 或 E 或 X 驱动器上的任何内容。