systemctl не удалось подключиться к шине - Docker Ubuntu: 16.04 контейнер

72

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

systemctl status ssh

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

Failed to connect to bus: No such file or directory

Почему это не работает? Это связано с тем, что Ubuntu работает в Docker-контейнере? Как мне systemctlправильно работать?

Дункан Гравилл
источник
2
Использованиеservice ssh start
Бидют

Ответы:

50

Я полагаю, вы начинаете свой док-контейнер с чем-то вроде

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

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

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

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

user228505
источник
Такие сервисы, как openssh-server, настроены на вход в систему по умолчанию для системного журнала. Как я могу получить логи sshd, не полагаясь на systemctl?
Parth Shah
@ParthShah, пожалуйста, загляните на страницу руководства sshd. У меня есть следующие опции: Вызывая его с -D, вы можете держать его на переднем плане. с помощью -e вы указываете ему печатать журналы напрямую. позже они могут быть проверены с помощью докера docker log.
user228505
[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не существует, вам нужно ее создать. Полное обсуждение находится в панели ответов systemd .

WinEunuuchs2Unix
источник
2
Я попробовал это без успеха. Так как мой экземпляр Ubuntu 16.04 имеет форму контейнера-докера, и я не настроил ни одного пользователя, с которым я работаю root, поэтому я использовал переменную XDG_RUNTIME_DIR=/run/root/0без успеха. Затем я проверил папку /runи обнаружил, что нет подпапки /run/root. Могу ли я получить более подробное сообщение об ошибке? Я посмотрел, systemctl --helpно не смог найти подробные сообщения об ошибках.
Дункан Гравилл
1
У меня та же проблема, и это также не решило мою проблему. Вы когда-нибудь выясняли это @DuncanGravill
Роланд,
3
@Reland Да. Я задал аналогичный вопрос о SO, который получил более сильный ответ. Также я рекомендую посмотреть учебники Self-Paced на сайте Docker. В этих видеороликах (слегка расплывчато) объясняется, как PID 1обычно systemdзаменяется в контейнере Docker контейнером Entrypoint .
Дункан Гравилл
Отлично, спасибо! Мне это нужно было, чтобы запустить / управлять пользовательским блоком из системного блока.
Адриан Гюнтер
6

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

ijustlovemath
источник
3

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

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

или же

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

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

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

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

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

Сонджая Сонджая
источник
2
Не могли бы вы объяснить свою команду и разницу с принятым вопросом ?
Мелебиус
Добро пожаловать в AskUbuntu! Спасибо за попытку помочь! Быстрый просмотр документации приводит меня к мысли, что вы, возможно, допустили ошибку или 2 в этой команде. Если вы будете так любезны, отредактируете это и объясните, что вы делаете и как это решает проблему, пингуйте меня, и я вернусь и предоставлю вам голос!
Старейшина Гик
Когда вы говорите images_docker, вы имеете в виду vanilla Ubuntu: 16.04? Или что-то другое?
Parth Shah
2

Просто запустите dbusсервис:

/etc/init.d/dbus start
moovs
источник
1

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

Смотрите мой ответ на systemctl: команда не найдена 16.04 сервер для получения дополнительной информации.

Хью Бунту
источник
Но это контейнер Ubuntu, который по умолчанию не имеет systemd и не имеет выскочки.
Стефан Ласевский
что? Ubuntu по умолчанию использует systemd
knocte
Стефан: Я верю, что вы правы в случае с Докером.
Хью Бунту
knocte: мой комментарий касается случая обновления с 14.04 (Upstart) до 16.04 (systemd). При выполнении обновления версии Upstart не заменяется systemd по понятным причинам (например, не ломая систему). Оглядываясь назад, я понимаю, что процесс обновления релиза не будет использоваться в Docker. Смотрите ссылку, которую я назвал. Я вижу, что ряд ответов и комментариев не учитывает конкретный случай Docker, и я буду искать это при ответе в будущем.
Хью Бунту
0

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

NEERAJ SWARNKAR
источник
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
Саиф
Почему -1? Я только что опубликовал, что работает для меня.
Саиф
downvote не было моим ...
Zanna