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が使用できるようになりました。

参考記事

"https://qiita.com/Targityen/items/6e80b855b79d521412f0"

"https://genchan.net/it/virtualization/docker/13093/"

今日の一言

systemctlは、よく使うからびびったぜ!!!