Search code examples
dockercentossystemctl

Operation not permitted systemctl with docker + systemctl


Dockerfile

FROM centos:7
ENV container docker
VOLUME ["/sys/fs/cgroup"]
RUN yum -y update
RUN yum install -y httpd
RUN systemctl start httpd.service
ADD . /code
WORKDIR /code

docker-compose.yml

version: '2'
services:
web:
   privileged: true
   build: .
   ports:
    - "80:80"
   volumes:
    - .:/code

command

docker-compose build

error:

Step 6 : RUN systemctl start httpd.service ---> Running in 5989c6576ac9 ?[91mFailed to get D-Bus connection: Operation not permitted ?[0m?[31mERROR?[0m: Service 'web' failed to build: The command '/bin/sh -c syste mctl start httpd.service' returned a non-zero code: 1

Obs: running on a windows 7 :(

Any tip?


Solution

  • As explained in centos docker image repository, Systemd is not active by default. In order to use systemd, you will need to include text similar to the example Dockerfile below:

    FROM centos:7
    MAINTAINER "you" <your@email.here>
    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"]
    

    This Dockerfile deletes a number of unit files which might cause issues. From here, you are ready to build your base image.

    $ docker build --rm -t local/c7-systemd .
    

    In order to use the systemd enabled base container created above, you will need to change your Dockerfile to:

    FROM local/c7-systemd
    ENV container docker
    VOLUME ["/sys/fs/cgroup"]
    RUN yum -y update
    RUN yum install -y httpd
    RUN systemctl start httpd.service
    ADD . /code
    WORKDIR /code