【问题标题】:Relative path in Docker container/volume for python scriptpython脚本的Docker容器/卷中的相对路径
【发布时间】:2018-02-02 08:54:54
【问题描述】:

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

目前我有这个设置:

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 文档,但似乎无法理解如何使其工作,我们将不胜感激。

【问题讨论】:

  • 所以这个pd.read_csv 将在容器内运行并且卷将从主机挂载?

标签: python-2.7 docker containers mounted-volumes


【解决方案1】:

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

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

希望对您有所帮助。

【讨论】:

  • 谢谢罗伯!我会在今天有时间的时候尝试一下,我会告诉你一切的进展情况。感谢详细的回复,没想到把它复制到容器卷中我只是专注于如何访问另一个容器位置的数据。
  • 嘿 Rob,我发现了一种类似的方法来实现您在谈论复制容器时所描述的相同的事情: docker run -v my-volume:/data --name helper busybox true, docker cp 。 helper:/data, docker rm helper stackoverflow.com/questions/37468788/…
  • @MichaelDalton 是的,我的解决方案的替代方案是使用docker cp。例如,您可以创建一个脚本,将今天的文件复制到运行容器的主机上,然后将docker cp 复制到容器中。无论哪种方式都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 2013-02-02
  • 1970-01-01
  • 2023-04-05
  • 2019-06-16
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多