Как я должен контейнер python сценарий, который читает файл CSV? - PullRequest
0 голосов
/ 17 апреля 2020

Я запускаю простой python скрипт с pandas, который должен прочитать CSV-файл, чтобы выдать вывод. Я могу запустить это вручную, однако, когда я пытаюсь поместить скрипт в контейнер, он не запускается.

Сначала я создал Dockerfile, используя gedit Dockerfile внутри папки с именем Python -test :

FROM python:3

RUN pip install pandas

WORKDIR /mydata

COPY TestCode.py ./

CMD python TestCode.py

Затем я построил образ, используя команду сборки, и образ с именем 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

Скажите, пожалуйста, что я делаю не так и как мне поступить?

Спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

Когда вы запускаете контейнер 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')

говорит мне, что вам нужно изменить строку 5 TestCode.py на что-то вроде этого:

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

Редактировать:

Вы попросили меня объяснить немного больше. Я не гений, поэтому я бы рекомендовал прочитать официальную документацию (https://docs.docker.com/engine/reference/builder/), но вот краткое объяснение того, о чем вы спрашивали.

Сначала ваш Dockerfile.

Эта первая строка означает, что ваше основное изображение python: 3. Существует множество общедоступных изображений, которые предварительно созданы для конкретных c вариантов использования (например, с установленными зависимостями Python). (см. https://hub.docker.com/_/python)

FROM python:3

Это означает, что выполните команду pip install pandas

RUN pip install pandas

Это означает, что ваш рабочий каталог - / mydata

WORKDIR /mydata

Следующая строка означает копирование TestCode.py с вашего хост-компьютера в ./, в данном случае это / mydata. Таким образом, вы получите файл /mydata/TestCode.py на вашем Docker изображении.

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 .

Это означает, что захватите файл Docker в текущем каталоге, используйте его для создания образа и назовите изображение python -test.

Наконец, команда docker run. См. Документы -> https://docs.docker.com/engine/reference/commandline/run/.

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

Это означает запуск контейнера docker с использованием образа python. Назовите contianer pytest и смонтируйте том вашего текущего каталога в / data в контейнере. (см. https://docs.docker.com/engine/reference/commandline/run/#mount -объем - v --- только для чтения ).

Опять же, документы покрывают это гораздо лучше, чем я, поэтому я бы посмотрел там .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...