概要
dockerからCnetOS7のコンテナを起動し、 systemctl
コマンドからサービスを制御しようとしたところ以下のエラーに遭遇しました。
# systemctl
Failed to get D-Bus connection: Operation not permitted
ここでは上記のエラーを解消するための方法について記載します。
はじめに
そもそもこの D-Bus
とは何か。
D-Bus (Desktop Bus) はメッセージバスと呼ばれる、アプリケーション間でやりとりを行うための、プロセス間通信(IPC)実装のひとつ。加えて、プロセスの生成期間を調節し、それらのサービスが必要なときに簡単に呼び出すことが出来るようにするものである。軽量さ、低依存度を保って開発されている。
Wikipedia からの引用となりますが、 D-Bus
はプロセス間通信の実装を表しているようです。
はじめて目にしましたが、要は何らかの原因でプロセス間通信の制御が許可されていないようです。
エラー解消までに試したこと
1. CentOS7イメージのpull
まずはCentOS7のイメージを pull してきてコンテナを起動できるようにします。
# docker pull centos:7
2. コンテナの起動 (失敗)
CentOS7のイメージをベースにコンテナを起動してみます。
まずは何も考えずにそのまま run
します。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 1e1148e4cc2c 4 days ago 202MB
# docker run -it 1e1 /bin/bash
3. systemctlコマンドの実行 (失敗)
systemctl
コマンドを実行したところ、例のエラーメッセージが表示されました。
# systemctl
Failed to get D-Bus connection: Operation not permitted
4. コンテナ起動時に --privileged オプションを利用 (失敗)
先ほどのコンテナは exit で終了し、改めてコンテナ起動時に --privileged
オプションを付けて試してみます。
# docker run -it --privileged 1e1 /bin/bash
# systemctl
Failed to get D-Bus connection: Operation not permitted
結果、エラーメッセージは表示されてしまいます。
5. コンテナをdetach起動して/sbin/initを実行 (成功)
どうやら systemctl
コマンドを使うためにはコンテナを detach したうえで /sbin/init
を実行する必要があるようです。
detch したコンテナにはあとから exec
でattachするようにします。
# docker run -d --privileged 1e1 /sbin/init
8badab2733bd54d514f597dcad8e642851a144da5cc62f6686d329aae34309b8
# docker exec -it 8ba /bin/bash
# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
dev-sda1.device loaded activating tentative /dev/sda1
-.mount loaded active mounted /
dev-hugepages.mount loaded active mounted Huge Pages File System
...(略)...
無事にCentOS7のコンテナで systemctl
が使えるようになりました。