python 脚本的 Docker container/volume 中的相对路径

Relative path in Docker container/volume for python script

我是 Docker 的新手,但使用 docker 工具箱为 windows 10.

成功地对一些现有的 python 代码进行了 Dokcerizing

目前我有这个设置:

picture of working python code in Docker container

这是通过 Docker 文件完成的:

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

所以我想知道如何引用其他 container/volume 以便我可以在我的主体 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 文件?

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

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

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

1.共享卷

使用 Docker 创建卷很容易。特别好的是,您可以创建一个具有特定名称的卷:

docker volume create data-volume

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

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

所以我们在这里 运行 从 my-container-image Docker 图像中创建一个容器,并在该容器内的 /data 处安装 data-volume 卷。

您的 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 应用程序共享,这正是您想要的。

希望对您有所帮助。