4

我是 Docker 新手,但在使用 Windows 10 的 docker 工具箱对一些现有的 python 代码进行 Dokcerizing 方面取得了成功。

目前我有这个设置:

在 Docker 容器中工作的 Python 代码的图片

这是通过 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(充其量)。

我想要的容器设置图片

所以我想知道如何引用其他容器/卷,以便我可以访问主体 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 文档,但似乎无法理解如何使其工作,任何帮助将不胜感激。

4

1 回答 1

8

是的,就考虑使用卷而言,您走在正确的轨道上。我会把它分成三个部分:

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

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 代码可以轻松地从该目录中读取它需要的文件。例如,/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 应用程序共享,这正是您想要的。

希望有帮助。

于 2017-08-24T13:23:05.457 回答