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

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    Под Windows приходится запускать Linux в виртуальной машине, чтобы запустить Docker контейнер (ведь Docker построен на Linux-овых Napespace и Cgroups), а это требует много ресурсов.

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

    Попробуй использовать WSL2 - это должно изменить ситуацию в лучшую сторону, но всё равно до нативных показателей будет далековато.
    Ответ написан
    4 комментария
  • Почему docker exec выполняется очень долго и есть ли способ ее ускорить?

    @rodion4dev
    Это, наверное. не тянет на ответ, но выполнение команды внутри запущенного контейнера, по-моему, и должно быть тяжеловесным.

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

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

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

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

    В общем вариантов много.
    Ответ написан
    Комментировать
  • Почему subprocess.Popen.communicate возвращает результат команды time (Linux) как ошибку?

    вот два примера докерфайла
    передающих строку форматирования команде time через опцию и окружение
    и перенаправляющие stderr в stdout
    FROM python:3.8.2-alpine
    ARG FILENAME_ARG
    ENV FILENAME $FILENAME_ARG
    # time on alpine does not recognize a long --format argument
    CMD time -f '%U' python temp/${FILENAME} 2>&1

    FROM python:3.8.2-alpine
    ARG FILENAME_ARG
    ENV FILENAME $FILENAME_ARG
    ENV TIME '%u'
    CMD time python temp/${FILENAME} 2>&1

    а почитать какие форматы поддериживаются проще всего через man time

    https://man7.org/linux/man-pages/man1/time.1.html

    TIME(1)                     General Commands Manual                    TIME(1)
    
    NAME
           time - run programs and summarize system resource usage
    
    
     %U     Total number of CPU-seconds that the process spent in user
                  mode.
    ...
    %R     Number of minor, or recoverable, page faults.

    не думаю что вам нужет был %R
    Ответ написан
    Комментировать
  • Не могу понять в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

    Вот это - трижды говнокод.
    1. Не засовывай в шаблонные строки ничего сложнее одной арфиметической операции - результат абсолютно нечитаем и неконтролируем (в чем ты убедился).
    Неправильно:
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

    Правильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

    2. Никогда не формируй запросы через форматирование строк. Слишком легко словить ошибку, явную или неявную.
    Неправильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id))

    Правильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) )

    3. Всегда проверяй, что ты получаешь из базы! Нет гарантий, что запись с указанным id и впрямь существует.
    Неправильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()[0]
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

    Правильно:
    score_row = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()
    if score_row is not None:
        description = f"""У тебя , **{ctx.author}** вот столько балов!**{score_row[0]} :polegar_para_cima:**"""
    else:
        # что делать, если такого юзера еще нет в базе?
        cursor.execute("INSERT INTO users (id, cash) VALUES (?, 0)", (ctx.author.id,) ) # можно его добавить
        description = f"""У тебя , **{ctx.author}** пока нет ничего! Но скоро будет!"""

    4. БаЛЛов, блин.
    Ответ написан
    5 комментариев
  • Как работать с несколькими Dockerfile в одном проекте?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Dockerfile для каждого контейнера необязателен. Dockerfile - в основном для специфических случаев. У меня к примеру процентов 80 контейнеров просто используют какой-нибудь python:3.9, а все библиотеки монтируются в виртуальное окружение непосредственно при запуске.
    Но если надо - то кладите где вам удобно, да подключайте директорию в контексте для билда образа.

    но для того чтобы каждый раз выполнялся нужный мне файл, при запуске контейнера мне нужно как-то передать туда название файла, как это сделать?

    монтируете директорию - да из нее нужные файлы и запускаете

    3) Для работы с Docker из Python я нашел библиотеку docker, стоит ли ее использовать

    Она для довольно специфических случаев использования докера. Проще запускать контейнеры каким-нибудь docker-composer
    Ответ написан
    4 комментария