@pinguine

Как правильно создать 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 скрипт успешно создавал файл и записывал в него.

У меня следующие вопросы:

1. Правильно ли я оформил `Dockerfile` и собрал образ? Принято ли создавать виртуальное окружение внутри образа и в нем устанавливать все зависимости, или нужно делать как-то иначе (например, не создавать окружение, а сразу устанавливать все зависимости)?
2. Куда пропал мой `output.csv`. Как сделать так, чтобы он создавался в той же директории, в которой запускается образ и принято ли так делать?
3. Как обычно распространяются такие образы? Достаточно ли просто оставить `Dockerfile` в репозитории с проектом?
  • Вопрос задан
  • 586 просмотров
Пригласить эксперта
Ответы на вопрос 2
2. Ваш файл сохранился внутри контейнера, а не на хост машине. Как сказал Алексей Ярков, вам нужно подключить volume.
3. Образы обычно распространяются через Docker Hub. Это аналог github для докер образов.
Ответ написан
Комментировать
@metajiji
Образ собрали и да и нет. Во первых для облегчения объема используйте python:3-alpine, во вторых сделайте через использование промежуточного образа, а именно 2 раза FROM, в первом будет сборка venv, во втором копирование venv и вашего скрипта. ENTRYPOINT можно не менять и писать имя вашей программы, ее можно закинуть в PATH, например в /usr/local/bin, но это не обязательно.

А вот что обязательно, так это сохранение данных, которые генерит ваша программа внутри контейнера на диск хоста, а не контейнера, это делается через volume, как написали выше.

Например, docker run --rm ti -v $(pwd)/data:/data avito_parser_cli "трактор мтз" -t -m 300000 -s 'date' -a

Ожидается, что программа внутри контейнера сохранит данные в папку /data, а на хосте они будут в $(pwd)/data
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы