Django застрял после запуска команды Docker в качестве подпроцесса

Когда я выполняю эту команду:

manim_command = f'sudo docker run --rm -v {base_dir}/manim/python_code_files:/mnt/code -v {base_dir}/media:/mnt/output manim-image manim -ql /mnt/code/user_code.py -o /mnt/output/{class_name}'

Используя subprocess.run или subprocess.Popen или os.system, он успешно запускается (создает изображение или видеофайл), но блокирует терминал и препятствует дальнейшему рендерингу шаблона.

Если файл уже присутствует, то шаблон будет успешно отрисован. Если же файла нет, то файл будет создан, но шаблон не будет отрисован.

Я пробовал запускать контейнер docker в отсоединенном режиме, но это просто отображает шаблон перед созданием файла. Очевидно, нам нужно дождаться окончания процесса:

    while True:
        if check_file_exists(class_name):
            break
        time.sleep(2)
    print('File created')    

Итак, он ждет, пока файл не будет создан, но когда я добавляю этот блок, он ждет, пока файл будет создан, печатает 'File created' и затем застревает прямо перед рендерингом шаблона.

почему не рендерится?

        try:
            # Run the function
            run_manim_command(class_name)
            print('function completed')
            
        except Exception as e:
            result_message = f"Error executing shell command: {e}"

        #after POST request
        
        context = {'previous_code': previous_code,
                   'MEDIA_URL': settings.MEDIA_URL,
                   'class_name':class_name,
                   'placeholder': False,
                }
        return render(request, 'run.html',context)    

Он даже выводит 'function completed'


Я пробовал:

  • использование потока для запуска в качестве асинхронного процесса, но результат тот же, что и при запуске в отсоединенном режиме
  • .
  • остановка и удаление контейнера. Кажется, что контейнер уже остановлен, потому что я использовал --rm. Так что же блокирует?
  • Убийство подпроцесса с помощью process.kill() и process.terminate(). Эти команды выполнились без ошибок, но не разблокировали терминал.
  • запускается с os.system вместо subprocess.
  • Запуск без shell= True, тот же результат
  • .

Вернуться на верх