skip to Main Content

I’ve a C++ program running in a docker container. I want to reboot container via my program but I cannot.

Dockerfile:

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

docker-entrypoint.sh

#!/bin/bash
./mainapp -e

Here is my reboot function (cleared from unnecessary codes):

    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");

I can see ALL the outputs and then it prints an error message. Here is the error message:

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.

I tried to reboot from container but it doesn’t work as well:

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

I’ve searched this problem and tried most of the suggestions but they didn’t solved my problem.

I am open to all your ideas and suggestions.

2

Answers


  1. Chosen as BEST ANSWER

    Thanks for the answers. I added this to my docker compose yaml file:

        privileged: true
        restart: always
    

    After that, reboot(RB_AUTOBOOT); rebooted my container and started the app successfully.


  2. system("reboot") tries to use the shell (which may not exist in your docker container) to run the reboot command (which may not exist in your docker container). Besides, "rebooting" is not a well-defined concept. You can’t reboot the kernel, since that’s shared. A docker container is an app-level container.

    To restart your app, and by extension the container, just use docker restart=always and then call std::exit(0) to exit your app normally.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search