Почему docker exec выполняется очень долго и есть ли способ ее ускорить?

Я создаю контейнер:
docker run -it -d --env TIMEFORMAT=\n%3R --name python_container -v (текущая директория)\temp:/temp docker_python_runner bash


Через команду exec запускаю скрипт внутри контейнера:
docker exec -i python_container bash -c "time python temp/temp_file.py" 2>&1


Допустим, это будет скрипт, который просто складывает 2 числа (например, stdin: 5 10).

Вывод:
15
0.025


Т.е результат работы программы: 15, время выполнения скрипта: 0.025, при том что общее время выполнения команды exec - 1.0805566310882568

Все команды я запускаю из python скрипта при помощи библиотеки subprocess:
result = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True, encoding='utf-8')
stdout, stderr = result.communicate(input=stdin, timeout=5)


Моя операционная система - Windows

Вообще все это делается для тестирования пользовательского кода => я запускаю одну и ту же exec команду раз 15 - 20. Как ускорить ее выполнение и может быть есть способ как то оптимизировать именно этот момент?
  • Вопрос задан
  • 286 просмотров
Решения вопроса 1
karabanov
@karabanov Куратор тега Docker
Системный администратор
Под Windows приходится запускать Linux в виртуальной машине, чтобы запустить Docker контейнер (ведь Docker построен на Linux-овых Napespace и Cgroups), а это требует много ресурсов.

Попробуй сначала зайти в контейнер: docker exec -it python_container bash
И потом запускать скрипт: time python temp/temp_file.py

Попробуй использовать WSL2 - это должно изменить ситуацию в лучшую сторону, но всё равно до нативных показателей будет далековато.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rodion4dev
Это, наверное. не тянет на ответ, но выполнение команды внутри запущенного контейнера, по-моему, и должно быть тяжеловесным.

Я глубоко не изучал этот вопрос, но это ведь подобие виртуализации: только с виртуальной машиной общаются на уровне обычных протоколов, а с Docker контейнером - какими-то своими средствами и на прикладном уровне (насколько я это понимаю).

Что касается ускорения - попробуй сделать скрипт, который будет засыпать на некоторое время и, просыпаясь, смотреть в volume, дёргать оттуда данные, и складывать их; а результат писать в stdout.

Ну и, к слову, открытие подпроцесса - тоже операция не из лёгких, наверное потому и скорость такая. Лучше запустить один главные процесс (без дочерних) и в нём выполнять все необходимые операции.

Или ещё один вариант - собрать свой образ, зашить туда ENTRYPOINT в виде твоего скрипта, и передавать туда данные для вычисления.

В общем вариантов много.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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