首页 > 解决方案 > 我应该如何容器化读取 CSV 文件的 python 脚本?

问题描述

我正在使用 pandas 运行一个简单的 python 脚本,它需要读取一个 CSV 文件以提供输出。我可以手动运行它,但是当我尝试将脚本放入容器时,它不会运行。

我首先创建了一个 Dockerfile,gedit Dockerfile在一个名为Python-test的文件夹中使用:

FROM python:3

RUN pip install pandas

WORKDIR /mydata

COPY TestCode.py ./

CMD python TestCode.py

然后我使用 build 命令和名为python-test的图像构建了一个图像 docker build -t python-test .

建成后,我创建了一个容器并运行它docker run --name pytest -v ${PWD}:/data python-test

但是,我收到以下错误:

Traceback (most recent call last):
  File "TestCode.py", line 5, in <module>
    df = pd.read_csv(r'/var/lib/docker/volumes/myvol/_data/Book1.csv')
  File "/usr/local/lib/python3.8/site-packages/pandas/io/parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python3.8/site-packages/pandas/io/parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "/usr/local/lib/python3.8/site-packages/pandas/io/parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python3.8/site-packages/pandas/io/parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python3.8/site-packages/pandas/io/parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 374, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas/_libs/parsers.pyx", line 674, in pandas._libs.parsers.TextReader._setup_parser_source
FileNotFoundError: [Errno 2] File /var/lib/docker/volumes/myvol/_data/Book1.csv does not exist: '/var/lib/docker/volumes/myvol/_data/Book1.csv'

我使用的 CSV 文件称为Book1.csv

请告诉我我做错了什么,我应该如何继续?

谢谢你。

标签: pythonlinuxpandasdockercsv

解决方案


当您运行 docker 容器时,您正在使用-v ${PWD}:/data. 如果运行此文件时 Book1.csv 文件在您的当前目录中,则在您正在运行的 docker 容器上,它将可以在/data/Book1.csv.

这部分错误

File "TestCode.py", line 5, in <module> 
df = pd.read_csv(r'/var/lib/docker/volumes/myvol/_data/Book1.csv')

告诉我您需要将 TestCode.py 的第 5 行更改为以下内容:

df = pd.read_csv('/data/Book1.csv')

编辑:

你问了,我再解释一下。我不是天才,所以我建议您阅读官方文档(https://docs.docker.com/engine/reference/builder/),但这里是您所问问题的简短解释。

首先,你的 Dockerfile。

第一行意味着你的基础镜像是 python:3。有很多公开可用的图像是为特定用例预先构建的(比如安装了 Python 依赖项)。(见https://hub.docker.com/_/python

FROM python:3

这意味着运行命令pip install pandas

RUN pip install pandas

这意味着您的工作目录是 /mydata

WORKDIR /mydata

下一行意味着将 TestCode.py 从主机复制到 ./,在本例中为 /mydata。因此,您最终会在 Docker 映像上获得文件 /mydata/TestCode.py。

COPY TestCode.py ./

CMD部分为可执行容器定义了一些默认值。有关更多详细信息,请参阅https://docs.docker.com/engine/reference/builder/#cmd

CMD python TestCode.py

接下来是 docker build 命令。请参阅文档-> https://docs.docker.com/engine/reference/commandline/build/

docker build -t python-test .

这意味着抓取当前目录中的 Dockerfile 并使用它来构建映像,并将映像命名为 python-test。

最后是 docker run 命令。请参阅文档-> https://docs.docker.com/engine/reference/commandline/run/

docker run --name pytest -v ${PWD}:/data python-test

这意味着使用 python-test 映像运行 docker 容器。命名 contianer pytest,并将当前目录的卷挂载到容器中的 /data 中。(参见https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only)。

同样,文档比我做得更好,所以我会在那里看看。


推荐阅读