Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как правильно создать Docker-контейнер?

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

Комментариев нет:

Отправить комментарий