#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, либо полностью собирать из докерфайла.
Комментариев нет:
Отправить комментарий