schedule2021-10-05

Centos7のdockerコンテナでsystemctlが「Failed to get D-Bus connection Operation not permitted」となるのを回避するdocker-compose.ymlの設定

DockerでたてたCentos7のコンテナでsystemctlが実行できなかった。

# systmctl start httpd
Failed to get D-Bus connection: Operation not permitted

どうやらsystemctlを実行する権限がないようです。 docker-compose.ymlの設定で解決します。

解決方法: privilegedを有効にする、 /sbin/initを起動する

  • privilegedで権限を有効にする
  • /sbin/initから起動する 以上の二つを行うとsystemctlが実行できるようになります。

docker-compose.yml と Dockerfile

docker-compose.yml
version: "3"

services:
  dcloud:
    build: ./
    ports:
      - "8080:80"
    # 権限の有効化
    privileged: true
Dockerfile
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
  systemd-tmpfiles-setup.service ] || rm -f $i; done); \
  rm -f /lib/systemd/system/multi-user.target.wants/*;\
  rm -f /etc/systemd/system/*.wants/*;\
  rm -f /lib/systemd/system/local-fs.target.wants/*; \
  rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
  rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
  rm -f /lib/systemd/system/basic.target.wants/*;\
  rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]

# /sbin/initから起動する
CMD ["/usr/sbin/init"]

以上の設定でsystemctlが利用できるcentos7のコンテナが作成できました。

Dockerfileの設定はDockerhubにあるCentOSのofficial buildと同じです。

/sbin/initdocker-compose.ymlで設定してもよさそう。

docker-compose.yml
version: "3"

services:
  dcloud:
    build: ./
    ports:
      - "8080:80"
    # 権限の有効化
    privileged: true
    command: /sbin/init ## これ

DockerをVMのように利用する

Dockerコンテナは1コンテナで 1プロセスを起動するような設計方針であるため、httpdプロセスのみを起動する方が一般的です。

今回のようにDockerをVMっぽく利用する際には /sbin/init

参考