Как передавать данные в консоль 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;
}
Такой код ставит всё в тупик.
Итак, нужно решить проблему с передачей данных в докер. Если есть идеи для более хорошей реализации, то скажите пожалуйста.