Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Start a service in docker container failed,with error: Failed to get D-Bus connection: No connection to service manager

I installed docker image and built a image successfully.

When I ssh to the container and run the command service xxx start, an error popped:

service nginfra start

Redirecting to /bin/systemctl start nginfra.service /sbin/service: line 79: /bin/systemctl: No such file or directory

Actually, fakesystemd is installed in the container instead of systemd.

So I removed fakesystemd and installed systemd with the command: yum swap -- remove fakesystemd -- install systemd systemd-libs

But I still can't start the service:

service nginfra start

Redirecting to /bin/systemctl start nginfra.service Failed to get D-Bus connection: No connection to service manager.

Does anyone ever meet and solved this issue?

like image 936
baoxinru Avatar asked Feb 13 '15 08:02

baoxinru


People also ask

How do I fix failed to get D bus connection Operation not permitted?

To rectify the last error , we need to modify default docker-machine environment setup and have to create and mount cgroup directory as a partition for systemd. Retry the setup of container , installation of apache and try to start the httpd services, it should be success this time.

What is Linux D bus?

D-Bus is an inter-process communication (IPC) mechanism initially designed to replace the software component communications systems used by the GNOME and KDE Linux desktop environments (CORBA and DCOP respectively).

What is D flag in Docker Run command?

Using -d to Detach the Container Another useful parameter to pass to docker run is the -d flag. This flag causes Docker to start the container in "detached" mode. A simple way to think of this is to think of -d as running the container in "the background," just like any other Unix process.


2 Answers

I've managed to fix this issue in a CentOS:7 Docker container. I've followed mainly the Guide on CentOS Docker image project.

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/*;

# Install anything. The service you want to start must be a SystemD service.

CMD ["/usr/sbin/init"]

Now, build the image, and run it using at least the following arguments to docker run command: -v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro

Then main point is that /usr/sbin/init must be the first process inside the Docker container.

So if you want to use a custom script that executes some commands before running /usr/sbin/init, launch it at the end of your script using exec /usr/sbin/init (in a bash script).

Here is an example:

ADD cmd.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/cmd.sh

CMD ["/usr/local/bin/cmd.sh"]

And here is the content of cmd.sh:

#!/bin/bash

# Do some stuffs

exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8

You could have System is booting up. See pam_nologin(8) if your using the PAM system, in that case, delete /usr/lib/tmpfiles.d/systemd-nologin.conf in your Dockerfile because it creates the file /var/run/nologin which generates this specific error.

like image 54
Anthony O. Avatar answered Oct 03 '22 02:10

Anthony O.


This is known issue with systemd-based OSes inside Docker containers.

Short answer: as well as replacing fakesystemd with systemd you need to attach /sys/fs/cgroup as a read-only volume into the container, build the image and then run it in "privileged" mode.

This is the best guide I've found for this. It uses Centos as the example, but should work with any systemd-based OS.

like image 24
ocean Avatar answered Oct 03 '22 02:10

ocean