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

6

我是 Docker 的新手,但使用 Windows 10 上的 Docker 工具箱成功将一些现有的 Python 代码 Docker 化。

目前我的设置如下:

在 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文档,但似乎无法理解如何使其正常工作。任何帮助将不胜感激。

所以这个 pd.read_csv 将在容器内运行,卷将从主机挂载? - Tarun Lalwani
1个回答

10

你思路正确,需要使用数据卷来实现。我会将它分成三部分:

  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!我会尽快尝试一下,今天有时间就会回来告诉你结果。非常感谢你详细的回复,我没有想到将其复制到容器卷中,我只是关注如何访问另一个容器位置的数据。 - Michael Dalton
1
嗨,罗布,我发现了一个类似的方法来实现你描述的关于复制容器的方式:docker run -v my-volume:/data --name helper busybox true, docker cp . helper:/data, docker rm helperhttps://dev59.com/MloU5IYBdhLWcg3wcmm8 - Michael Dalton
1
@MichaelDalton 是的,我的解决方案的另一种选择是使用 docker cp。例如,您可以创建一个脚本将今天的文件复制到运行容器的主机上,然后再将它们 docker cp 到容器中。无论哪种方式都完全可行。 - Rob Lockwood-Blake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接