dockerでCentOS7を使って、systemctlコマンドを打ったら、「Failed to get D-Bus connection: Operation not permitted」というエラーが出ました。
2021-08-22
こんにちは、0371です。
今回は、dockerのCentOS7の「Failed to get D-Bus connection: Operation not permitted」というエラーの解決方法について書きます。
エラーに至るまで
まずは、行った手順について書いていきます。
# CentOS7のイメージを取得します。
$ docker pull centos:7
# CentOS7のイメージを使用し、コンテナを生成、起動します。
$ docker run -it -d --name centos7 centos:centos7
# CentOS7の中に入ります。
$ docker exec -it centos7 /bin/bash
# CentOS7の中で、systemctl を実行すると怒られました。
$ systemctl
Failed to get D-Bus connection: Operation not permitted
どういうエラーなんですか?
直訳すると***「D-Bus接続の取得に失敗しました:操作は許可されていません」***です。
では、「D-Bus」とはなんなのかというと、
D-Bus(Desktop Bus、ディーバス)は、メッセージバスと呼ばれる、アプリケーション間でやりとりを行うための、プロセス間通信 (IPC) 実装の1つである。プロセスの生成期間を調節し、それらのサービスが必要なときに簡単に呼び出すことができるようにすることができる。
"https://ja.wikipedia.org/wiki/D-Bus"
とのことです。
つまり、「D-Subが使えないので、プロセス間の通信ができません。」ということですね。
解決しよう
DockerはデフォルトでLinux系コンテナに対して制限がかかっているため、「systemctl」などのシステム系のコマンドが使えなかったり、動作しないようです。
そのため、bin/bashではなく、sbin/init と指定してコンテナを起動する必要があります。
sbinだと、システム管理者用のコマンドも使えるようになります。
# 一度コンテナから抜けます。
$ exit
# 使用したコンテナのImage TAG を確認します。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 8652b9f0cb4c 9 months ago 204MB
centos centos7 8652b9f0cb4c 9 months ago 204MB
# TAG を指定して、デタッチドモード、特権モードで起動する。
$ docker run -d --privileged --name privileged-centos7 --hostname privileged-centos7 centos:centos7 /sbin/init
60c7cf5bf5b518e38fbe56e1b427bd1f14d6878fe5e93d2ed598c6552e867b61
# 表示されたIDを指定して、コンテナの中に入る
$ docker exec -it privileged-centos7 /bin/bash
# systemctl を実行すると、エラーが出ずに実行結果が表示される。
$ systemctl
UNIT LOAD ACTIVE SUB JOB DESCRIPTION
dev-ttyS0.device loaded inactive dead start dev-ttyS0.device
dev-vda1.device loaded activating tentative /dev/vda1
-.mount loaded active mounted /
dev-hugepages.mount loaded active mounted Huge Pages File System
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
etc-hostname.mount loaded active mounted /etc/hostname
(省略)
これで、systemctlが使用できるようになりました。
参考記事
今日の一言
systemctlは、よく使うからびびったぜ!!!