CentOS7コンテナでsystemctlが使えない時

はじめに

表題の様な件が起こり調査を行ったので、その結果をまとめておきたいと思います。まずは準備も兼ねて問題の再現から行います。

dockerをインストール・起動します。
# yum -y install docker
# systemctl start docker

HubからCentOS7のイメージをプルしてビルドします。

# vi Dockerfile
FROM centos:7
RUN yum -y update
# docker build -t centos:7 ./
# docker images
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   dcbb85881b03        17 minutes ago      373 MB
docker.io/centos    7                   5e35e350aded        3 months ago        203 MB

作成したイメージを元にコンテナを起動するのですが、systemctlを使いたいので管理者権限を付与して起動します。

# docker run -itd --privileged --name centos7 centos:7
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8d5c12f1794a        centos:7            "/bin/bash"         13 seconds ago      Up 13 seconds                           centos7
# docker exec -it centos7 /bin/bash

これで準備が完了しました。試しにsystemctlコマンドを使ってみようとすると次のようなエラーが吐かれます。

# systemctl
Failed to get D-Bus connection: Operation not permitted

対応

原因としてはこのコンテナではsystemdが起動していないからです。Dockerでは (諸説ありますが) 1コンテナ1プロセスと言われている位で、余り余計なプロセスは立ち上げない事が理想なので、VMの様に使うことはベストプラクティスではないようです。自分は使っていますが……

そこでコンテナ内でsystemdを立ち上げたければコンテナ起動時に引数でコマンドを渡してあげる必要があります。

# docker run -itd --privileged --name centos7 centos:7 /sbin/init
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
35fe787bd7d2        centos:7            "/sbin/init"        36 seconds ago      Up 36 seconds                           centos7
# docker exec -it centos7 /bin/bash

通常/sbin/initsystemdへのリンクになっているので、これでsystemctlが使えるようになるはずです。

# systemctl
  UNIT                                                   LOAD   ACTIVE     SUB       DESCRIPTION
  proc-sys-fs-binfmt_misc.automount                      loaded active     waiting   Arbitrary Executable File Formats File System Automount Point
  dev-xvda1.device                                       loaded activating tentative /dev/xvda1
  -.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

~ 略 ~

これで使えるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA