この記事はosからイメージを指定して作ろうとして、FROM centos から構築して
Failed to connect to bus: No such file or directory docker
System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
というエラーで詰まってブチ切れそうになっている人は以下の方法を確認してみてください。原因は「公式に解決法がありました」から述べていきます。
この記事で使用したOSとdockerのバージョン
apacheのイメージを入れるとosがUbuntuだったりで、できたらosから指定したいなーと思ってcenots8の環境にapacheを入れて行こうと思い以下のようにDockerfileを記述
FROM centos:8
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN yum install -y epel-release && yum clean all
RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm
RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all
RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip
RUN ln /usr/bin/php74 /usr/bin/php
RUN chown -R apache:apache /var/www/html
RUN systemctl enable php74-php-fpm
RUN systemctl enable httpd
php入っていますがとりあえず上のような感じで必要なものを入れて、apacheを常にONにすれば行けるだろ思い、ビルドする
$ docker build -t centos_apche:1.0 .
ビルドは普通に成功しました。イメージが作られたのを確認していざコンテナを起動。
docker run -t -d -p 9000:80 centos_apche:1.0
しかし localhost:9000 にアクセスすると「データが送信されませんでした」と真っ黒(chrome)。docker ps
で稼働状態を調べてもコンテナはきちんと動いている。つまりコンテナの中で何か起きている。
docker exec -it {container_id or name} /bin/bash
...
[root@32212888398b /]#
[root@32212888398b /]# systemctl httpd status
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
「は?」とりあえずhttpdが動いていないそうな上に「Host is down」とos自体がダメと言うことか?systemctl
だけ打ってもエラーしか出ない。
いろいろ調べましたが systemd
を起動する方法がcentos7、centos:latest(つまり8)ではデフォルトでアクティブにならず一工夫必要だそうです。
私も詳しい仕組みまではわからないのですが、まずDockerfileを以下のように追記します。
FROM centos:8
#ここから
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" ]
CMD ["/usr/sbin/init"]
#ここまで
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN yum install -y epel-release && yum clean all
RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm
RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all
RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip
RUN ln /usr/bin/php74 /usr/bin/php
RUN chown -R apache:apache /var/www/html
RUN systemctl enable php74-php-fpm
RUN systemctl enable httpd
そしてビルドは普通に行い、コンテナを立ち上げる際はボリュームともう一つオプションを指定します。
docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -t -d -p 9000:80 centos_apched:1.0
-v /sys/fs/cgroup:/sys/fs/cgroup:ro
でファイルシステムをホストマシンからボリュームし、--privileged
でコンテナにホストマシンのroot権限を与ます。どちらか片方が抜けてもいけません。
このオプションとボリュームを指定するとsystemd
が動きます。実際にコンテナに入っていくとsystemctl
コマンドが実行されました。