Python Docker中管理持久数据存储的惯用方法

Python Docker中管理持久数据存储的惯用方法,python,docker,docker-compose,dockerfile,Python,Docker,Docker Compose,Dockerfile,设置 我的本地机器上有10多个Gig的图像,将来可能会有TB的图像,在这种情况下,它将托管在aws上。这些图像将被提供给一些网站,也将作为机器学习管道的输入 现在我正在本地机器上开发。源代码位于path/to/src,数据位于path/to/images。我已经用Dockerfile设置了Docker环境: FROM bamos/openface ADD . /face-off WORKDIR /face-off RUN pip install -r requirements.txt

设置

我的本地机器上有10多个Gig的图像,将来可能会有TB的图像,在这种情况下,它将托管在aws上。这些图像将被提供给一些网站,也将作为机器学习管道的输入

现在我正在本地机器上开发。源代码位于
path/to/src
,数据位于
path/to/images
。我已经用
Dockerfile
设置了
Docker
环境:

FROM bamos/openface
ADD . /face-off
WORKDIR /face-off    
RUN pip install -r requirements.txt    
EXPOSE 5000    
CMD [ "python", "app.py" ]
docker compose
文件:

version: '2'
services:
  web:
    build: .
    image: face-off-web
    command: python app.py
    ports:
        - "5000:5000"
    volumes:
        - .:/face-off
  redis:
    image: "redis:alpine"
问题

因为我是在
Docker
容器中开发的,所以我需要访问
path/to/images
中的所有图像。现在让我们保持简单,假设我使用预先指定的磁盘路径读取图像。我认为我的选择是:

  • 一个明显的方法是将所有图像移动到
    path/to/src
    ,但这对我来说似乎很脏

  • 另一种可能是在
    Dockerfile
    中添加
    目录。因此,我需要将这两个目录移动到
    path/to/project
    ,而
    Dockerfile
    将位于此处。然后将src移动到
    path/to/project/src
    ,将数据移动到
    path/to/project/data
    。但这又一次闻起来很像选项1

  • 使用
    docker compose
    以某种方式将数据导入。我现在不知道该怎么做,尽管我读了docker volume上的文档

  • 处理这个问题的惯用方法是什么?如果方法是选项3,有人能解释一下怎么做吗

  • 使用docker compose以某种方式引入数据。我现在不知道怎么做,尽管我读了docker卷上的文档 对于您的用例,您希望将主机路径装载到您的容器中,就像您已经使用项目工作目录所做的那样。只需为图像添加另一行:

    version: '2'
    services:
      web:
        build: .
        image: face-off-web
        command: python app.py
        ports:
          - "5000:5000"
        volumes:
          - .:/face-off
          - /images/on/host:/path/in/container
      redis:
        image: "redis:alpine"
    
    在旁注中,要么使用,要么不同时使用

  • 使用docker compose以某种方式引入数据。我现在不知道怎么做,尽管我读了docker卷上的文档 对于您的用例,您希望将主机路径装载到您的容器中,就像您已经使用项目工作目录所做的那样。只需为图像添加另一行:

    version: '2'
    services:
      web:
        build: .
        image: face-off-web
        command: python app.py
        ports:
          - "5000:5000"
        volumes:
          - .:/face-off
          - /images/on/host:/path/in/container
      redis:
        image: "redis:alpine"
    

    另一方面,可以同时使用,也可以不同时使用。

    当我这样做时,我会得到:“错误:在文件中”。/docker compose.yml“service”volumes“没有任何配置选项。docker-compose.yml中的所有顶级键都必须映射到配置选项字典。”仔细检查缩进,目前docker compose假设
    是一项服务,我只发布了docker-compose.yml的一个片段,我认为
    -.:/face off
    将足以作为参考。啊,所以我使用的是1.6.0版,尽管在我的compose文件中显示的是版本2。当你说当前版本时,你是指版本2还是版本3?不,我是指你的
    docker compose.yml
    当前是错误的。我根据您最初的
    docker compose.yml
    更新了我的答案,并提供了一个完整的示例。希望现在更清楚一点。啊,我明白了,当我这样做的时候很有趣,我指定使用主机上的相对路径和绝对路径,但是当我用
    docker run运行容器时-它面对web bash
    ,我
    cd
    四处,我在任何地方都找不到它?当我这样做时,我得到:错误:文件“./docker compose.yml”服务“卷”中没有任何配置选项。docker-compose.yml中的所有顶级键必须映射到配置选项字典。“仔细检查缩进,目前docker compose假设
    是一项服务,我只发布了docker-compose.yml的一个片段,我假设
    -.:/face off
    将足以作为参考。啊,所以我使用的是1.6.0版,尽管在我的compose文件中显示的是版本2。当你说当前版本时,你是指版本2还是版本3?不,我是指你的
    docker compose.yml
    当前是错误的。我根据您最初的
    docker compose.yml
    更新了我的答案,并提供了一个完整的示例。希望现在更清楚一点。啊,我明白了,当我这样做的时候很有趣,我指定了主机上的相对路径和绝对路径,但是当我运行带有
    docker run的容器时,它面对web bash
    ,我
    cd
    ,我在任何地方都找不到它?