dockerのcentos7イメージ上で、yumで入れたhttpdを起動します。systemd経由では起動しないので、httpdを直接たたきます。

systemd経由ではエラーが出る

開発環境でcentos7のhttpdを再現したいとき、Dockerfileはこんな感じになります。

FROM centos:7
MAINTAINER noldor

RUN yum -y install httpd

CMD ["systemctl", "start", "httpd.service"]

しかし、これだとエラーが出ます。

Failed to get D-Bus connection: Operation not permitted

もしくは Failed to get D-Bus connection: No connection to service manager. と出るようです。

systemdを経由せずhttpdを直接起動する

これを何とかするために --privileged で特権をつける、そのためにコンソールに入る、というようなことがググると出てきます。Operation not permitted なので権限を与えてやる発想と思いますが、D-Busを要求するのはhttpdではなくsystemdなので、systemctlを経由しなければこのエラーは出ません。

というわけで次のようにします。

FROM centos:7
MAINTAINER noldor

RUN yum -y install httpd

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

この起動コマンドは /usr/lib/systemd/system/httpd.service の中に書いてあります。

EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND

$OPTIONS/etc/sysconfig/httpd の中で定義するものですが、デフォルトでは空っぽなので /usr/sbin/httpd -DFOREGROUND と同じになります。

systemdでは自動起動や再起動を管理していますが、開発環境ではdockerイメージまるごと起動したり落としたりになるでしょうからsystemdを経由する必要はなく、こちらのほうが素直です。コンソールを使わずにdocker-composeで管理できるようになります。