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/initはdocker-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
参考
Docker Desktopの有料化が発表されたので対象かどうか確認した
Dockerschedule2021-09-12