如何将读取CSV文件的python脚本容器化?

如何将读取CSV文件的python脚本容器化?,python,linux,pandas,docker,csv,Python,Linux,Pandas,Docker,Csv,我正在使用pandas运行一个简单的python脚本,它需要读取一个CSV文件以提供输出。我可以手动运行它,但是当我尝试将脚本放入容器时,它不会运行 我首先创建了一个Dockerfile,在名为Python test的文件夹中使用gedit Dockerfile: FROM python:3 RUN pip install pandas WORKDIR /mydata COPY TestCode.py ./ CMD python TestCode.py 然后,我使用build命令和名为

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

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

FROM python:3

RUN pip install pandas

WORKDIR /mydata

COPY TestCode.py ./

CMD python TestCode.py
然后,我使用build命令和名为python-test的映像构建了一个映像

构建之后,我创建了一个容器并运行它
dockerrun--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'
回溯(最近一次呼叫最后一次):
文件“TestCode.py”,第5行,在
df=pd.read_csv(r'/var/lib/docker/volumes/myvol/_data/Book1.csv')
文件“/usr/local/lib/python3.8/site packages/pandas/io/parsers.py”,第676行,在parser\u f中
返回读取(文件路径或缓冲区,kwds)
文件“/usr/local/lib/python3.8/site packages/pandas/io/parsers.py”,第448行,已读
parser=TextFileReader(fp_或_buf,**kwds)
文件“/usr/local/lib/python3.8/site packages/pandas/io/parsers.py”,第880行,在__
自制发动机(自制发动机)
文件“/usr/local/lib/python3.8/site packages/pandas/io/parsers.py”,第1114行,在“make”引擎中
self.\u engine=CParserWrapper(self.f,**self.options)
文件“/usr/local/lib/python3.8/site packages/pandas/io/parsers.py”,第1891行,在__
self.\u reader=parsers.TextReader(src,**kwds)
文件“pandas/_libs/parsers.pyx”,第374行,在pandas._libs.parsers.TextReader.\uu\cinit__
文件“pandas/_libs/parsers.pyx”,第674行,在pandas._libs.parsers.TextReader._setup_parser_source中
FileNotFoundError:[Errno 2]文件/var/lib/docker/volumes/myvol/_data/Book1.csv不存在:'/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')
编辑:

你让我再解释一下。 我不是天才,所以我建议你阅读官方文档(),但这里有一个简短的解释

首先,你的Dockerfile

第一行表示您的基础映像是python:3。 有很多公开的图像是为特定用例预先构建的(比如安装了Python依赖项)。 (见附件)

这意味着运行命令
pip install

RUN pip install pandas
这意味着您的工作目录是/mydata

WORKDIR /mydata
下一行的意思是将TestCode.py从主机复制到./,在本例中是/mydata。 因此,您将在Docker映像上得到文件/mydata/TestCode.py

COPY TestCode.py ./
CMD
部分为可执行容器定义了一些默认值。 有关更多详细信息,请参阅

CMD python TestCode.py
接下来是docker build命令。见文件->

这意味着获取当前目录中的Dockerfile并使用它构建一个映像,然后将映像命名为python test

最后,docker运行命令。见文件->

这意味着使用python测试映像运行docker容器。命名contianer
pytest
,并将当前目录的卷装载到容器中的/data中。(见附件)


再说一次,这些文件比我更能说明这一点,所以我要看一下。

嘿,非常感谢您的更正!我最近刚开始接触docker,对此不太了解。我刚刚创建了一个Docker文件,并在联机查找后运行命令。你能简要地解释一下我在Dockerfile、build命令和run命令中写了什么吗?@Arrow我在我的回答中添加了更多的解释。希望它有助于和快乐的建设!哇,这太棒了!非常感谢你的解释。这帮了大忙!
COPY TestCode.py ./
CMD python TestCode.py
docker build -t python-test .
docker run --name pytest -v ${PWD}:/data python-test