Docker容器中的相对路径/ python脚本

时间:2017-08-24 12:54:20

标签: python-2.7 docker containers mounted-volumes

我是Docker的新手,但是使用Windows 10的docker工具箱成功地使用了一些现有的python代码。

目前我有这个设置:

picture of working python code in Docker container

这是通过Dockerfile完成的:

FROM python:2.7.13
WORKDIR /root
COPY ./requirements.txt /root/requirements.txt
RUN pip install -r requirements.txt
COPY . /root
CMD ["python", "main.py"]

我的所有代码都在容器中,包含一堆CSV和.pkl文件。事情是CSV和.pkl文件每天都在变化,所以经过一些阅读后,我想我可以将这些文件拆分成一个卷,甚至可以是一个单独的容器,我可以每天修改和上传,而无需更改主要的Python脚本1.4G大小和我的上传速度是40kbps(充其量)。

Picture of container setup that i would like

所以我想知道如何引用其他容器/卷,以便我可以访问我的主体Python代码中的CSV和/ pkl文件?目前所有东西都在同一个目录中,所以没有问题我只需要调用.csv / .pkl名称就行了

#open the local .csv file
data = pd.read_csv(csv_select)
#open the local .pkl file
pickled_list = pickle.load(open(can_cat+".pkl","rb"))

我如何引用上面的代码从单独的容器中打开csv / pkl文件?

我已经阅读了大量的stackoverflow帖子和docker文档,但似乎无法理解如何使其工作,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

是的,你在考虑使用音量方面走在正确的轨道上。我会把它分成三个部分:

  1. 您在一个容器中运行的python代码
  2. 您的python容器与一个或多个其他容器之间共享的卷
  3. “数据复制”容器,每天将最新数据复制到共享卷。
  4. <强> 1。共享卷

    使用Docker创建卷很简单。特别好的是,您可以创建具有特定名称的卷:

    docker volume create data-volume
    

    所以我们在这里创建了data-volume命名卷。然后,您可以使用如下命令将其安装到任何容器上:

    docker run --rm -v data-volume:/data my-container-image
    

    因此,我们在my-container-image Docker镜像中运行一个容器,并将data-volume卷安装在该容器中的/data

    您的python代码可以从该目录.e.g /data轻松读取所需的文件,或者您可以根据需要更改挂载点。

    <强> 2。将更改的数据复制到卷

    下一步是创建一个可以将最新更改复制到该目录的简单应用程序。再说一次,这个应用程序将最新数据复制到它自己的文件系统上的/data。基本上我们想要一个应用程序:

    cp $TODAYS_DATA.csv $TODAYS_DATA.pkl /data
    

    我们可以在容器中运行此应用,并确保容器的data-volume安装在data,例如:

    docker run --rm data-volume:/data my-data-copying-app
    

    这个容器可能非常简单,例如:

    FROM alpine:latest
    COPY ./todaysdata /todaysdata
    

    然后您可以使用以下命令运行它:

    docker run --rm data-volume:/data my-data-copy-image "/bin/sh -c cp -r /todaysdata/* /data/"
    

    基本上,您只需使用命令运行容器,即可将今天的数据复制到/data。因为/data实际上是一个卷,所以最新数据会立即与您的python应用程序共享,这正是您想要的。

    希望有所帮助。