Клиент Django google kubernetes не запускает exe внутри задания
У меня есть образ docker, который я хочу запустить внутри моего кода django. Внутри этого образа есть исполняемый файл, который я написал на c++ и который записывает свой вывод в облачное хранилище google. Обычно, когда я запускаю код django следующим образом:
container = client.V1Container(name=container_name, command=["//usr//bin//sleep"], args=["3600"], image=container_image, env=env_list, security_context=security)
И вручную зайдите внутрь контейнера, чтобы выполнить следующее:
gcloud container clusters get-credentials my-cluster --region us-central1 --project proj_name && kubectl exec pod-id -c jobcontainer -- xvfb-run -a "path/to/exe"
Работает как положено и отдает вывод в облачное хранилище. (Мне нужно использовать виртуальный монитор, поэтому я сначала использую xvfb). Однако я должен вызвать это через django следующим образом:
container = client.V1Container(name=container_name, command=["xvfb-run"], args=["-a","\"path/to/exe\""], image=container_image, env=env_list, security_context=security)
Но когда я делаю это, задание создается, но никогда не завершается и не выдает выходной сигнал в хранилище. Когда я захожу в свой контейнер для запуска ps aux
, я получаю следующий результат:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2888 1836 ? Ss 07:34 0:00 /bin/sh /usr/bin/xvfb-run -a "path/to/exe"
root 16 0.0 1.6 196196 66256 ? S 07:34 0:00 Xvfb :99 -screen 0 1280x1024x24 -nolisten tcp -auth /tmp/xvfb-run.r5gaBO/Xauthority
root 35 0.0 0.0 7016 1552 ? Rs 10:31 0:00 ps aux
Похоже, что он застрял внутри моего кода, но в моем коде нет цикла, внутри которого он мог бы застрять, возможно, произошла ошибка (я так не думаю, поскольку точно такая же команда работает при вводе вручную). Если ошибка есть, как я могу увидеть вывод консоли? Почему мой код застревает и как я могу получить желаемый результат? Может ли ошибка быть вызвана разрешениями (код делает много вещей, которые требуют разрешений, например, запись в хранилище и чтение файлов внутри капсулы, но, как уже упоминалось, он работает нормально, когда я запускаю его через командную строку)?
При работе с Docker и Django довольно часто случаются ситуации, когда контейнер постоянно перезапускается / не запускается. Обычно это указывает на проблему в Django, и логи показывают нам, что именно не так (не нужно гадать).
Итак, необходимо проверить журналы контейнера
docker logs CONTAINER
Это даст более подробную информацию об ошибке, и, исходя из этого, человек будет знать, как ее исправить, поскольку он получит более конкретную ошибку.
Для тех, кто столкнулся с подобной проблемой, мы исправили ее, добавив команду, которую мы хотим запустить, в конце Dockerfile
вместо того, чтобы передавать ее в качестве параметра внутри вызова контейнера django следующим образом:
cmd["entrypoint.sh"]
entrypoint.sh:
xvfb-run -a "path/to/exe"
Вместо того, чтобы вызвать его внутри django, как мы делали раньше, и просто удалить аргумент command из вызова контейнера, чтобы он выглядел следующим образом:
container = client.V1Container(name=container_name, image=container_image, env=env_list, stdin=True, security_context=security)