なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

systemdベースのOSでdockerするときはsystemdのunitファイルを消さないと変なことになるかも

systemdベースのOSでdockerするときはsystemdのunitファイルを消さないと変なことになるかも

問題

Centos7でdockerイメージを作成し、mysqlを起動させようとしたところ、変なエラーが出て起動できない

# Dockerfile
...(いろいろ処理)
RUN systemctl start mysqld

# docker-compose up -d --build
...(いろいろログ)
error: Failed to get D-Bus connection: No connection to service manager ←????

解決策

FROM centos:7

# 後述の理由で環境変数定義
ENV container docker

# /lib/systemd/system/sysinit.target.wants/ 以下にあるunitファイルを削除して回る
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 を定義する
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

それぞれの理由

For some undocumented reason the variable container=docker is apparently required. /sys/fs/cgroup is also required, as SystemD needs cgroups to work properly according to RedHat Bug 1033604.

  • /sys/fs/cgroup はともかく、ENV container dockerを指定しなければいけないのはバグっぽく見えるが…
  • docker-compose.yml に書いたほうがいい気がする

参考

以下2つは参考になったので見ておくといいかもしれない

追記

qiita.com