Не удается перезагрузить систему с C++

У меня есть программа на С++, работающая в док-контейнере. Я хочу перезагрузить контейнер через свою программу, но не могу.

Докерфайл:

FROM gcc

WORKDIR /client
COPY . .

RUN apt-get update && apt-get install qt5-qmake qtbase5-dev libmosquitto-dev -y

RUN qmake mainapp.pro && make
RUN chmod +x docker-entrypoint.sh

Докер-entrypoint.sh

#!/bin/bash
./mainapp -e

Вот моя функция перезагрузки (очищенная от ненужных кодов):

    Logger::getInstance()->write(QString("Sync"));
    sync();
    Logger::getInstance()->write(QString("Setuid"));
    setuid(0);
    Logger::getInstance()->write(QString("RB_AUTOBOOT"));
    reboot(RB_AUTOBOOT);
    Logger::getInstance()->write(QString("Reboot"));
    system("reboot");

Я вижу ВСЕ результаты, а затем печатает сообщение об ошибке. Вот сообщение об ошибке:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.

Я попытался перезагрузиться из контейнера, но это тоже не работает:

root@93501f6d7fc8:/client# reboot
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
root@93501f6d7fc8:/client# shutdown -r
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Я искал эту проблему и пробовал большинство предложений, но они не решили мою проблему.

Я открыт для всех ваших идей и предложений.

Запуск Docker-контейнера — это просто набор процессов. Что вы хотите перезагрузить в наборе процессов?

dimich 11.11.2022 08:14

Может быть, вы не знаете, чего хотите? Может быть, вы хотите сделать что-то вроде «перезапустить docker my_container» или «выйти» или что-то в этом роде?

Öö Tiib 11.11.2022 09:24

Я хочу перезагрузить весь контейнер и снова запустить приложение.

Syrenthia 11.11.2022 09:25

Я не смогу запустить «контейнер перезапуска докеров». Доступ к этому приложению будет только с сообщениями MQTT. Я отправлю сообщение о перезагрузке через MQTT, а затем он должен перезапуститься.

Syrenthia 11.11.2022 09:27

Здесь может быть ответ: stackoverflow.com/questions/49713054/… (хотя похоже, что у него есть серьезные проблемы с безопасностью)

Frodyne 11.11.2022 09:49
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
5
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

System("reboot") пытается использовать оболочку (которой может не быть в вашем док-контейнере) для запуска команды reboot (которой может не быть в вашем док-контейнере). Кроме того, «перезагрузка» не является четко определенным понятием. Вы не можете перезагрузить ядро, так как оно является общим. Docker-контейнер — это контейнер уровня приложения.

Чтобы перезапустить приложение и, соответственно, контейнер, просто используйте docker restart=always, а затем вызовите std::exit(0), чтобы выйти из приложения в обычном режиме.

Ответ принят как подходящий

Спасибо за ответы. Я добавил это в свой файл yaml для создания докеров:

    privileged: true
    restart: always

После этого reboot(RB_AUTOBOOT); перезагрузил мой контейнер и успешно запустил приложение.

Я ожидаю, что это перезагрузит весь хост. Это то, чего вы на самом деле хотите?

David Maze 11.11.2022 13:24

Да. Без «привилегированного» я ​​не могу даже выполнить «перезагрузку» или «выключение» внутри контейнера.

Syrenthia 14.11.2022 12:35

Другие вопросы по теме