Как передавать данные в консоль docker?

Пишу веб приложение, которое должно получать код с помощью поля ввода от пользователя, а после нажатия кнопки "отправить". Я решил реализовывать написанный пользователем код через docker.

Такой способ достаточно не плохо работает с python, там удается передавать параметры запуска через echo.

Однако для других языков, например c, c++, java - не удается. Они начинаю ожидать ввода с моей реальной консоли.

Вот мой код для питона.

def python(code, input):
    try:

        with open("main.py", "w") as file:
            file.write(code)

        os.replace(os.path.abspath(os.getcwd()) + "\\main.py", os.path.abspath(os.getcwd()) + "\\code/" + "main.py")

        current_dir = os.path.abspath(os.getcwd()) + "\\code/"

        docker_command = f'docker run -i --rm -v {current_dir}:/code -w /code python:latest /bin/bash -c "echo \'{input}\' | timeout 5s python main.py"'
        result = subprocess.run(docker_command, shell=True, capture_output=True, text=True)
        return result.stderr or result.stdout
    except Exception as e:
        print(e)
    finally:
        if os.path.exists(os.path.abspath(os.getcwd()) + "\\code/" + "main.py"):
            os.remove(os.path.abspath(os.getcwd()) + "\\code/" + "main.py")

А вот код для c++

def cplus(code, input):
    # Записываем текст кода в файл main.cpp
    with open("main.cpp", "w") as file:
        file.write(code)

    os.replace(os.path.abspath(os.getcwd()) + "\\main.cpp", os.path.abspath(os.getcwd()) + "\\code/" + "main.cpp")

    current_dir = os.path.abspath(os.getcwd()) + "\\code/"
    docker_command = f'docker run -i --rm -v {current_dir}:/code -w /code gcc:latest /bin/bash -c "echo \'{input}\' | g++ main.cpp -o main && ./main"'

    result = subprocess.run(docker_command, shell=True, capture_output=True, text=True)
    return result.stderr or result.stdout

Как раз проблема в input. В питоне данные передаются, хоть и получается ограниченно, одной строчкой. Но хоть что-то.

А вот в c++ вообще ничего не передается. Файлы с простым выводом работают идеально. Вводить - никак не получается.

#include

int main() {

    std::string age = "";
    std::string weight = "";
    std::string name = "";
    
    std::cin >> age;
    std::cout << age;
    std::cin >> weight;
    std::cout << weight;
    std::cin >> name;
    std::cout << name;
}

Такой код ставит всё в тупик.

Итак, нужно решить проблему с передачей данных в докер. Если есть идеи для более хорошей реализации, то скажите пожалуйста.


Ответы (0 шт):