не удалось получить соединение D-Bus: операция не разрешена

Я пытаюсь перечислить службы на моем изображении CentOS, работающем в Docker, используя

systemctl list-units  

, но я получаю это сообщение об ошибке:

Failed to get D-Bus connection: Operation not permitted

Любые предложения о том, что может быть проблемой?

22 голоса | спросил Snowcrash 8 Jpm1000000pmSun, 08 Jan 2017 23:35:56 +030017 2017, 23:35:56

4 ответа


12

Я предполагаю, что вы используете контейнер non-privileged. systemd требует возможности CAP_SYS_ADMIN, но Docker отключает эту возможность в не-привилегированных контейнерах, чтобы добавить дополнительную безопасность.

systemd также требует доступа RO к файловой системе cgroup внутри контейнера. Вы можете добавить его с помощью –v /sys/fs/cgroup:/sys/fs/cgroup:ro

Итак, вот несколько шагов о том, как запустить CentOS с systemd внутри контейнера Docker:

  1. Pull centos image
  2. Настройте файл докеров, как показано ниже:

FROM centos MAINTAINER “Yourname" <[email protected]> ENV container docker RUN yum -y update; yum clean all RUN yum -y install systemd; yum clean all; \ (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”]

  1. Построить его - docker build --rm -t centos7-systemd - < mydockerfile
  2. Запустите контейнер с помощью docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init

  3. У вас должна быть systemd в вашем контейнере

ответил 13dimitar 9 Jam1000000amMon, 09 Jan 2017 10:53:17 +030017 2017, 10:53:17
2

Мне удалось исправить эту проблему в контейнере Docker CentOS: 7. Я следил в основном за руководство по проекту изображения на доске CentOS .

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"]

Теперь создайте образ и запустите его, используя по крайней мере следующие аргументы в команде docker run: -v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro

Тогда главное, что /usr/sbin/init должен быть первым процессом внутри контейнера Docker.

Итак, если вы хотите использовать собственный скрипт, который выполняет некоторые команды перед запуском /usr/sbin/init, запустите его в конце вашего скрипта, используя exec /usr/sbin/init (в сценарии bash).

Вот пример:

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

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

И вот содержание 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

У вас может быть System is booting up. See pam_nologin(8), если вы используете систему PAM, в этом случае удалите /usr/lib/tmpfiles.d/systemd-nologin.conf в вашем Dockerfile, потому что он создает файл /var/run/nologin, который генерирует эту конкретную ошибку.

ответил Anthony O. 1 MarpmWed, 01 Mar 2017 17:26:29 +03002017-03-01T17:26:29+03:0005 2017, 17:26:29
2

Это не прямой ответ на ваш вопрос, но на самом деле это может быть более важным, и я натолкнулся на это осознание, когда читал другие ответы здесь.

У меня был некоторый опыт миграции некоторых сложных систем в Docker, и одна из существенных реализаций, которые у меня были, это то, что в идеале вы должны иметь один контейнер Docker для каждого приложения /службы или «для каждого демона».

Одной из очень важных причин этого является то, что Docker не будет полностью отключать службы, которые вы начинаете с systemctl , и на самом деле вы можете столкнуться с такими же повреждениями базы данных, которые происходят из-за неожиданного отключения питания .

Чтобы погрузиться в это немного глубже: когда Docker выдает команду «stop» в контейнер, он посылает сигнал SIGTERM только одному процессу, который был запущен с CMD /ENTRYPOINT, а не ко всем службам и демонам. Так что у одной службы есть предупреждение о закрытии, и все остальные бесцеремонно прекращаются.

Если вам абсолютно необходимо упаковать две службы в одном контейнере (например, ваше приложение и базу данных PostgreSQL или что-то в этом роде), вам нужно, чтобы ваш CMD /ENTRYPOINT был скриптом, который ловит SIGTERM, а затем ретранслирует его в известные Сервисы. Это можно сделать, но если у вас есть такая возможность, переосмыслите свое решение и попробуйте разбить его на несколько контейнеров.

Добавление

Здесь есть интересная примечание /страница на сайте Docker об использовании supervisord, если вам абсолютно необходимо иметь несколько служб, работающих в одном контейнере.

ответил Murray Todd Williams 18 Maypm18 2018, 16:22:09
0

Я не хотел запускать systemd в качестве init /PID 1. После выполнения шагов очистки, упомянутых другими, я запускаю systemd из сценария запуска как /usr/lib/systemd/systemd --system &.

Это позволило systemd запустить и запустить зарегистрированные службы, но systemctl потерпел неудачу с ошибкой D-Bus.

Для меня недостающим звеном было отсутствие каталога /run /systemd /system, обнаруженного этим с помощью strace ing systemctl.

Создание этого каталога вручную перед запуском systemctl позволяет systemctl работать для меня.

ответил Chaim Geretz 9 PM00000080000000331 2018, 20:45:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132