#python #docker
Мне нужно обернуть мой парсер, а именно файл avito_parser_cli.py из репозитория https://github.com/denis5417/avito_parser
в Docker контейнер.
Я создал Dockerfile:
FROM python:3
ADD avito_parser.py avito_parser_cli.py requirements.txt /
RUN python3 -m venv env
CMD ['source', 'env/bin/activate']
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3", "avito_parser_cli.py"]
Я создаю виртуальное окружение и в него устанавливаю нужные мне зависимости. Я использую
ENTRYPOINT вместо CMD, чтобы принимать аргументы командной строки при запуске.
Затем я собрал образ sudo docker build -t avito_parser_cli .
Для тестирования я перешел в другую папку и запустил образ docker run avito_parser_cli
"трактор мтз" -t -m 300000 -s 'date' -a
Все аргументы распарсились правильно и скрипт выдал то что ожидалось. Но также он
должен был записать результат в файл output.csv, никаких ошибок он не выдал, но файл
я нигде не нашел. При запуске скрипта без Docker скрипт успешно создавал файл и записывал
в него.
У меня следующие вопросы:
Правильно ли я оформил Dockerfile и собрал образ? Принято ли создавать виртуальное
окружение внутри образа и в нем устанавливать все зависимости, или нужно делать как-то
иначе (например, не создавать окружение, а сразу устанавливать все зависимости)?
Куда пропал мой output.csv? Как сделать так, чтобы он создавался в той же директории,
в которой запускается образ и принято ли так делать?
Как обычно распространяются такие образы? Достаточно ли просто оставить Dockerfile
в репозитории с проектом?
Ответы
Ответ 1
Виртуальное окружение внутри контейнера лишнее. Контейнер сам по себе - изолированное виртуальное окружение. Если ваше приложение - единственное, что работает в контейнере (а идеология Docker склоняет именно к такому варианту), то все неодходимые программы и библиотеки можно устанавливать напрямую. Файлы, созданные программами, работающими внутри контейнера, лежат в виртуальной файловой системе контейнера и пропадут после его остановки. Для того чтобы их вытащить из контейнера и сохранить, нужно примонтировать к вашему контейнеру папку хоста и заставить программу писать в примонтированную папку. Подробно описано в документации, примеры и нюансы для Windows можно посмотреть здесь, кратко: docker run -v /path/on/host/machine:/path/inside/container my-docker-image. Завивит от того, как сильно вы хотите напрягать пользователей вашего контейнера. Если вы хотите избавить их от необходимости скачивать исходники и собирать образ самостоятельно, вы можете опубликовать ваш образ на Docker Hub или в каком-нибудь альтернативном репозитории (например, JCenter), чтобы ваши пользователи могли запускать контейнер просто через docker run.Ответ 2
Достать файлик из контейнера можно так: docker cp:/file/path/inside/container /file/path/outside/container Лично я их использовал для Дженкиса и имел опцию либо делать из уже готового сохранённого контейнера в формате tar.gz, либо полностью собирать из докерфайла.
Комментариев нет:
Отправить комментарий