systemctl не вдалося підключитися до шини - докер ubuntu: 16.04 контейнер


72

Я намагаюся використовувати systemctlкоманду в ubuntu:16.04контейнері docker. Я виконую наступну команду ...

systemctl status ssh

Однак я отримую помилку ...

Failed to connect to bus: No such file or directory

Чому це не працює? Це пов’язано з тим, що Ubuntu працює в докерному контейнері? Як я можу systemctlправильно працювати?


2
Використанняservice ssh start
Бідют

Відповіді:


50

Я припускаю, що ви починаєте свій докер-контейнер з чимось подібним

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

Проблема зараз полягає в тому, що ваш PID 1 init процесу /bin/bashне є системним. Підтвердити за допомогою ps aux.

На додаток до цього вам не вистачає dbus, щоб це був спосіб спілкування. Звідси надходить ваше повідомлення про помилку. Але оскільки ваш PID 1 не системний, це не допоможе встановити dbus.

Найкраще було б переосмислити спосіб, яким ви плануєте використовувати докер. Не покладайтеся на systemd як менеджера процесів, але змусьте контейнер docker запускати потрібну програму на передньому плані.


Такі сервіси, як openssh-сервер, налаштовані для входу в систему за замовчуванням syslog. Як я можу отримати журнали sshd, не покладаючись на systemctl?
Parth Shah

@ParthShah, будь ласка, ознайомтеся зі сторінкою sshd man. У шахти є такі варіанти: Якщо її натиснути за допомогою -D, ви можете зберегти її на передньому плані. з -е ви доручаєте йому безпосередньо друкувати журнали. згодом вони можуть бути оглянуті докерським способом docker log.
користувач228505

[FYI] отримувала цю помилку через /sbin/initте, що PID = 1 процес. Додавання, --privileged=trueяк запропонував @sonjaya sonjaya нижче, вирішило проблему.
DimG

прекрасна відповідь !!
Сачін Верма

11

Інші повідомили про подібну проблему. Запустіть термінал і введіть:

$ env

Чи бачите ви подібну змінну середовища?

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

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

Якщо змінної середовища XDG_RUNTIME_DIRне існує, вам потрібно створити її. Повна дискусія знаходиться у системних відповідях на панелі запуску .


2
Я пробував це без успіху. Оскільки мій екземпляр Ubuntu 16.04 має форму контейнера докера, і я не створив жодного користувача, над яким я працюю root, тому я XDG_RUNTIME_DIR=/run/root/0без успіху використовував змінну . Потім я перевірив папку /runі виявив, що немає підпапки /run/root. Чи все-таки я можу отримати більш детальне повідомлення про помилку? Я переглянув, systemctl --helpале не побачив способу отримання детальних повідомлень про помилки.
Дункан Гравілл

1
У мене те саме питання, і це також не вирішило мою проблему. Ви коли-небудь розбиралися в цьому @DuncanGravill
Roeland,

3
@Roeland Так. Я задав аналогічне запитання щодо SO, на яке було більш сильно відповідати. Також рекомендую переглянути навчальні посібники з кроком на веб-сайті Docker. У цих відеороликах пояснюється (трохи неясно), як PID 1правило systemd, що замінюється в контейнер Docker контейнером Entrypoint .
Дункан Гравілл

Блискуче, дякую! Мені це було потрібно для запуску / управління користувацьким блоком із системного блоку.
Адріан Гюнтер

5

Якщо ви отримуєте цю помилку в підсистемі Windows для Linux (WSL), я виявив, що Docker не підтримується. Це пов’язано з відсутністю угруповань та іншими передумовами.


3

Спробуйте це:

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

або

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

буде такий же результат.

Ось я дістався від doc Docker :

За замовчуванням Docker-контейнери є "непривілейованими" і не можуть, наприклад, запустити демон Docker всередині Docker-контейнера. Це відбувається тому, що за замовчуванням контейнеру заборонено доступ до будь-яких пристроїв, але "привілейований" контейнер отримує доступ до всіх пристроїв (див. Документацію на пристрої підгруп).

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


2
Чи можете ви пояснити свою команду та різницю прийнятому питанню ?
Мелебій

Ласкаво просимо до AskUbuntu! Дякую за спробу допомогти! Швидкий огляд документації приводить мене до думки, що ви, можливо, зробили помилку або 2 в цій команді. Якщо ви будете настільки люб'язні, щоб відредагувати це і пояснити, що ви робите, і як це вирішує проблему, надішліть мені пінг, і я повернусь і дам вам нагороду!
Старійшина Гік

Коли ви говорите images_docker, ви маєте на увазі ванільний ubuntu: 16.04? Або щось інше?
Парт Шах

1

Можливо, ви не запускаєте systemd , що є типовою реалізацією init 16.04. Якщо ви оновились з 14.04, ви, швидше за все, все ще працюєте вгору , а результат запуску команди systemctl - результат, який ви отримали.

Дивіться мою відповідь на systemctl: comand не знайдено сервера 16.04 для отримання додаткової інформації.


Але це контейнер Ubuntu, який за замовчуванням не має системи і не мав би запуску.
Стефан Ласєвський

що? ubuntu за замовчуванням
системний

Стефан: Я вважаю, що ви маєте рацію у справі Докера.
Х'ю Бунту

knocte: мій коментар стосується випадку оновлення з 14.04 (Upstart) до 16.04 (systemd). Виконуючи оновлення версії, Upstart не замінюється на systemd з зрозумілих причин (наприклад: не злом системи). Зрештою, я розумію, що процес оновлення випуску не використовується в Docker. Дивіться посилання, яке я зателефонував. Я бачу, що ряд відповідей та коментарів не враховує конкретний випадок Докера, і я буду шукати це під час відповіді в майбутньому.
Х'ю Бунту


0

Всередині контейнера докера, я думаю, ви можете оновити-rc.d, якщо ви все ще боретеся з systemd. Я спробував з update-rd.c, і він працює.


0

Я отримував таку саму помилку, і тоді я її успішно запускаю sudo

sudo systemctl status ssh

1
вам цього не потрібно sudo. Схоже на збіг. Чи можете ви пройти повторний тест?
Занна

1
@Zannasaif@sr-server:~$ systemctl status ssh Failed to connect to bus: No such file or directory saif@sr-server:~$ sudo systemctl status ssh [sudo] password for saif: ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-01-19 23:38:14 PKT; 4min 4s ago Main PID: 18222 (sshd) Tasks: 15 Memory: 32.7M CPU: 488ms
Saif

Чому -1? Я щойно розмістив те, що працювало на мене.
Сайф

downvote не був моїм ...
Zanna
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.