Я пытаюсь перечислить сервисы на моем образе CentOS, работающем в Docker, используя
systemctl list-units
но я получаю это сообщение об ошибке:
Failed to get D-Bus connection: Operation not permitted
Любые предложения, в чем может быть проблема?
sudo
?systemd
на CentOS, используйте этот образ:FROM centos/systemd
Ответы:
Я предполагаю, что вы работаете с
non-privileged
контейнером. systemd требуется возможность CAP_SYS_ADMIN, но Docker отбрасывает эту возможность в непривилегированные контейнеры, чтобы повысить безопасность.systemd также требуется доступ RO к файловой системе cgroup внутри контейнера. Вы можете добавить его с
–v /sys/fs/cgroup:/sys/fs/cgroup:ro
Итак, вот несколько шагов о том, как запустить CentOS с systemd внутри контейнера Docker:
docker build --rm -t centos7-systemd - < mydockerfile
Запустить контейнер с
docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init
Вы должны были бы systemd в вашем контейнере
источник
[ INFO ] Update UTMP about System Boot/Shutdown is not active. [DEPEND] Dependency failed for Update UTMP about System Runlevel Changes. Job systemd-update-utmp-runlevel.service/start failed with result 'dependency'. [ OK ] Started Journal Service. [ OK ] Reached target System Initialization. [ OK ] Reached target Timers. [ OK ] Listening on D-Bus System Message Bus Socket.
Failed to get D-Bus connection: Operation not permitted
/bin/bash
, чтобы получить оболочку. Однако это дало мне ранее упомянутую ошибку. Когда я запустил его,/usr/sbin/init
как было предложено, то приложил с оболочкой все прошло хорошо. Очевидно, мне не хватает нюанса о/usr/sbin/init
. Этот ответ заслуживает некоторого существенного одобрения./sys/fs/cgroup:/sys/fs/cgroup
это или откуда это происходит ... Я знаю, как смонтировать гостевую папку в хронологию, например:/src/:/var/www
но откуда ваш файл? Это вызывает у меня много ошибок, потому что я вставил код, я думаю, что я должен создать их где-тоЭто не прямой ответ на ваш вопрос, но на самом деле это может быть более важным, и я столкнулся с этой реализацией, когда читал другие ответы здесь.
У меня был некоторый опыт миграции некоторых сложных систем в Docker, и одна из важных реализаций, которые у меня были, заключается в том, что в идеале у вас должен быть один контейнер Docker для приложения / службы или «на демон».
Одна из очень важных причин этого заключается в том, что Docker не будет корректно завершать работу служб, которые вы запускаете с помощью systemctl, и фактически вы можете столкнуться с такими же повреждениями базы данных, которые происходят из-за неожиданного отключения питания.
Чтобы углубиться в это немного глубже: когда Docker выдает команду «stop» контейнеру, он отправляет сигнал SIGTERM только одному единственному процессу, который был запущен с CMD / ENTRYPOINT, а не всем службам и демонам. Таким образом, одна служба имеет предупреждение о чистом завершении работы, а все остальные отключаются.
Если вам абсолютно необходимо упаковать две службы в один и тот же контейнер (т.е. ваше приложение и базу данных PostgreSQL или что-то в этом роде), вам нужно, чтобы ваш CMD / ENTRYPOINT был сценарием, который перехватывает SIGTERM, а затем ретранслирует его в эти известные службы. Это можно сделать, но если у вас есть возможность, переосмыслите свое решение и попробуйте разбить его на несколько контейнеров.
Приложение
На сайте Docker есть интересная заметка / страница об использовании supervisord, если вам абсолютно необходимо иметь несколько служб, работающих в одном контейнере.
источник
Мне удалось решить эту проблему в контейнере CentOS: 7 Docker. Я следовал в основном Руководству по созданию изображений CentOS Docker .
Теперь создайте образ и запустите его, используя как минимум следующие аргументы для
docker run
команды:-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro
Тогда главное, что это
/usr/sbin/init
должен быть первый процесс внутри контейнера Docker.Поэтому, если вы хотите использовать собственный сценарий, который выполняет некоторые команды перед запуском
/usr/sbin/init
, запустите его в конце сценария, используяexec /usr/sbin/init
(в сценарии bash).Вот пример:
И вот содержание
cmd.sh
:Вы могли бы,
System is booting up. See pam_nologin(8)
если вы используете систему PAM, в этом случае удалить/usr/lib/tmpfiles.d/systemd-nologin.conf
в вашем,Dockerfile
потому что он создает файл,/var/run/nologin
который генерирует эту конкретную ошибку.источник
systemd-nologin.conf
/nologin
за победу, потому что заявки CentOS / RHEL 7UsePAM no
не поддерживаются и будут жаловаться в журналах как таковых. Не уверен, что RH openssh portable как-то исправил или сломал его, или они пытаются снизить свою поддержку от начинающих клиентов.Я не хотел запускать systemd как init / PID 1. После выполнения действий по очистке, упомянутых другими, я запускаю systemd из скрипта запуска as
/usr/lib/systemd/systemd --system &
.Это позволило systemd запускать и запускать зарегистрированные службы, но systemctl не работал с ошибкой D-Bus.
Для меня отсутствующей ссылкой было отсутствие каталога / run / systemd / system, обнаружил это с помощью
strace
systemctl.Создание этого каталога вручную перед запуском systemctl позволяет systemctl работать на меня.
источник