혹시 비슷하지만 약간 다른 에러 메시지(
Host is down)를 검색하는 거라면 다음 글을 참고하시기 바랍니다.
System has not been booted with systemd as init system (PID 1). Can't operate
Failed to connect to bus: Host is down
System_has_not_been_booted_with_systemd_as_init_system_PID_1_Can_t_operate_오류_해결하기
Docker container에서 systemctl 명령을 사용하다보면 다음과 같이 D-Bus 연결에 실패하여 에러가 발생하곤 한다.
sudo systemctl list-units
Failed to get D-Bus connection: Operation not permitted
에러 메시지가 약간 다른 경우도 있는데 다음과 같다.
sudo systemctl status
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
특권을 갖지(privileged) 못한 컨테이너라서 발생하는 문제이며 /sys/fs/cgroup에 대해서 공유가 필요하다.
다음 명령과 같이 --privileged 옵션과 -v /sys/fs/cgroup:/sys/fs/cgroup:ro 옵션을 지정하여 init 프로세스를 한 번 실행해줘야 한다.
docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro 추가옵션과 아규먼트들...
보통 이미 한 번 실패해서 사용할 수 없는 컨테이너가 실행 중일 거라서 kill해줄 필요가 있다.
docker ps
docker kill 컨테이너ID
init 프로세스는 interactive할 필요가 없으므로 일반적으로 bash를 실행할 때 사용하는 -it 옵션 대신에 -d 옵션을 지정한다.
docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro 컨테이너이미지 /usr/sbin/init
컨테이너 ID를 확인했으면 다음과 같이 실행한다.
docker exec -it 컨테이너ID /bin/bash
sudo systemctl status
systemctl 명령이 정상적으로 수행되는 것을 확인할 수 있다.
참고자료
https://serverfault.com/questions/824975/failed-to-get-d-bus-connection-operation-not-permitted