python - 我应该如何容器化读取 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
请告诉我我做错了什么,我应该如何继续?
谢谢你。
解决方案
当您运行 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)。
同样,文档比我做得更好,所以我会在那里看看。
推荐阅读
- r - R:按行的第n个元素ordered_by行值
- c# - 改装:版本化路线
- reactjs - Dragabbale 不会在 react-beautiful-dnd 中移动
- c++ - 为 OpenSplice 模板创建容器?
- bash - 使用脚本参数中的文件名对所有文件执行命令并存储在新目录中
- prometheus - 如何配置 Grafana 以捕捉 Prometheus 指标的急剧下降?
- php - 传递给 App\Http\Controllers\UsoSueloController::store() 的参数 1 必须是 Illuminate\Http\Request 的实例,给定字符串
- r - 尝试制作分组条形图并继续收到“-0.01 * 高度错误:二进制运算符的非数字参数”
- json - 在 listView QML 中使用嵌套 JSON 作为 section.property
- python - 加入三个表并专门对 pandas 中的列进行排序