Systemctl не удалось подключиться к bus - docker ubuntu: контейнер 16.04

Я пытаюсь использовать systemctl команда в ubuntu:16.04 докер-контейнер. Я выполняю следующую команду...

systemctl status ssh

Однако я получаю сообщение об ошибке...

Failed to connect to bus: No such file or directory

Почему это не работает? Связано ли это с Ubuntu, работающей в контейнере docker? Как я могу получить systemctl чтобы работать правильно?

Я предполагаю, что вы запускаете свой контейнер docker с помощью чего-то вроде

docker run -t -i ubuntu:16.04 /bin/bash

Проблема сейчас в том, что ваш PID процесса инициализации 1 равен /bin/bash, а не systemd.Подтвердите с помощью ps aux.

В дополнение к этому вам не хватает dbus, с помощью которых можно было бы общаться. Вот откуда приходит ваше сообщение об ошибке. Но поскольку ваш PID 1 не является systemd, это не поможет установить dbus.

Лучше всего было бы переосмыслить то, как вы планируете использовать docker. Не полагайтесь на systemd в качестве менеджера процессов, но пусть контейнер docker запускает нужное вам приложение на переднем плане.

Другие сообщали о подобной проблеме. Запустите терминал и введите:

$ env

Видите ли вы такую переменную окружения?

XDG_RUNTIME_DIR=/run/user/`id -u`

Где id -u заключен в обратные кавычки, а не в одинарные кавычки. Эта переменная обычно переосмысливается в число 1000 для обычных пользователей и 0 для суперпользователя (sudo).

Если переменная среды XDG_RUNTIME_DIR не существует, вам нужно его создать. Полное обсуждение находится в launchpad systemd ответы.

Просто начните dbus обслуживание:

/etc/init.d/dbus start

Если вы получаете эту ошибку в подсистеме Windows для Linux (WSL), я обнаружил, что это связано с тем, что Docker не поддерживается. Это связано с отсутствием групповых заданий и других предпосылок.

Попробуйте это:

docker run -ti -d --privileged=true images_docker  "/sbin/init"

или

docker run -ti -d --privileged=true images_docker

будет тот же результат.

Здесь я получаю от док из Докера:

По умолчанию контейнеры Docker являются “непривилегированными” и не могут, например, запускать демон Docker внутри контейнера Docker. Это связано с тем, что по умолчанию контейнеру не разрешен доступ ни к каким устройствам, но “привилегированному” контейнеру предоставляется доступ ко всем устройствам (см. документацию по устройствам cgroups).

Когда оператор выполняет docker run --privileged, Docker разрешает доступ ко всем устройствам на хосте, а также устанавливает некоторую конфигурацию в AppArmor или SELinux, чтобы предоставить контейнеру почти тот же доступ к хосту, что и процессам, запущенным вне контейнеров на хосте. Дополнительная информация о запуске с --privileged доступна в блоге Docker.

Возможно, вы не бежите systemd, который является реализацией по умолчанию в этом 16.04. Если вы обновились с 14.04, вы, скорее всего, все еще работаете выскочка, и результат выполнения systemctl команда - это результат, который вы получили.

Смотрите мой ответ на systemctl : команда не найдена сервер 16.04 для большего.

Я получал точно такую же ошибку, а затем успешно запустил ее с помощью sudo

sudo systemctl status ssh

Внутри контейнера docker, я думаю, вы можете обновить-rc.d, если вы все еще боретесь с systemd. Я попробовал с помощью update-rd.c, и это работает.

Используйте запуск службы ssh

Для тех, у кого такая же проблема с “sudo systemctl --user”… просто удалите “sudo”!

Черт возьми. У меня был псевдоним `systemctl" на “sudo systemctl --no-pager”. Спасибо за подсказку.