systemctl konnte keine Verbindung zum Bus-Docker-Ubuntu: 16.04-Container herstellen

72

Ich versuche, den systemctlBefehl in einem ubuntu:16.04Docker-Container zu verwenden. Ich führe den folgenden Befehl aus ...

systemctl status ssh

Allerdings bekomme ich den Fehler ...

Failed to connect to bus: No such file or directory

Warum funktioniert das nicht? Steht dies im Zusammenhang mit Ubuntu, das in einem Docker-Container ausgeführt wird? Wie kann ich richtig systemctlarbeiten?

Duncan Gravill
quelle
2
Verwenden Sieservice ssh start
Bidyut

Antworten:

50

Ich nehme an, Sie starten Ihren Docker-Container mit so etwas wie

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

Das Problem ist jetzt, dass Ihr Init-Prozess PID 1 ist /bin/bash, nicht systemd. Bestätigen Sie mit ps aux.

Außerdem fehlt dir dbus, mit dem du kommunizieren würdest. Hier kommt Ihre Fehlermeldung her. Da Ihre PID 1 nicht systemd ist, hilft es nicht, dbus zu installieren.

Am besten überlegen Sie, wie Sie Docker verwenden möchten. Verlassen Sie sich nicht auf systemd als Prozessmanager, sondern lassen Sie den Docker-Container Ihre gewünschte Anwendung im Vordergrund ausführen.

user228505
quelle
Dienste wie openssh-server sind so konfiguriert, dass sie sich bei der Standard-Syslog-Einrichtung anmelden. Wie kann ich sshd-Protokolle abrufen, ohne mich auf systemctl zu verlassen?
Parth Shah
@ParthShah, bitte überprüfen Sie die sshd-Manpage. Meins hat die folgenden Optionen: Wenn Sie es mit -D kalieren, können Sie es im Vordergrund halten. mit -e weisen Sie es an, die Protokolle direkt auszudrucken. Diese können dann später im Hafen mit inspiziert werden docker log.
user228505
[FYI] hat diesen Fehler mit /sbin/initdem Prozess PID = 1 erhalten. Das Hinzufügen, --privileged=truewie von @sonjaya sonjaya unten vorgeschlagen, löste das Problem.
DimG
schöne antwort !!
Sachin Verma
11

Andere haben ein ähnliches Problem gemeldet. Starten Sie das Terminal und geben Sie Folgendes ein:

$ env

Sehen Sie eine Umgebungsvariable wie diese?

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

Wo id -uin Backticks nicht einfache Anführungszeichen eingeschlossen sind. Diese Variable wird in der Regel 1000für normale Benutzer und 0für Superuser (sudo) in eine Zahl uminterpretiert .

Wenn die Umgebungsvariable XDG_RUNTIME_DIRnicht vorhanden ist, müssen Sie sie erstellen. Die vollständige Diskussion ist in Launchpad-System und Antworten .

WinEunuuchs2Unix
quelle
2
Ich habe es ohne Erfolg versucht. Da meine Ubuntu 16.04-Instanz die Form eines Docker-Containers hat und ich keine Benutzer eingerichtet habe, als die ich arbeite root, habe ich die Variable XDG_RUNTIME_DIR=/run/root/0ohne Erfolg verwendet. Dann habe ich den Ordner überprüft /runund festgestellt, dass es keinen Unterordner gibt /run/root. Kann ich trotzdem eine ausführlichere Fehlermeldung erhalten? Ich habe nachgesehen systemctl --help, konnte aber keine Möglichkeit finden, detaillierte Fehlermeldungen zu erhalten.
Duncan Gravill
1
Ich habe das gleiche Problem und dies hat auch mein Problem nicht gelöst. Haben Sie jemals herausgefunden, dieses @DuncanGravill
Roeland
3
@Roeland Ja. Ich habe eine ähnliche Frage zu SO gestellt, die eine stärkere Antwort hatte. Außerdem empfehle ich, sich die Tutorials zum Selbststudium auf der Docker-Website anzusehen. In diesen Videos wird (etwas vage) erklärt, wie PID 1das, was normalerweise systemdin einem Docker-Container mit dem Container Entrypoint ersetzt wird .
Duncan Gravill
Genial, danke! Ich brauchte dies, um eine Benutzereinheit von einer Systemeinheit aus zu starten / verwalten.
Adrian Günter
5

Wenn dieser Fehler im Windows-Subsystem für Linux (WSL) auftritt, liegt dies daran, dass Docker nicht unterstützt wird. Dies ist auf fehlende Gruppen und andere Voraussetzungen zurückzuführen.

ijustlovemath
quelle
3

Versuche dies:

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

oder

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

wird das gleiche Ergebnis sein.

Hier bekomme ich von der Doku von Docker :

Docker-Container sind standardmäßig nicht privilegiert und können beispielsweise keinen Docker-Daemon in einem Docker-Container ausführen. Dies liegt daran, dass ein Container standardmäßig nicht auf Geräte zugreifen darf, sondern dass einem "privilegierten" Container Zugriff auf alle Geräte gewährt wird (siehe Dokumentation zu cgroups-Geräten).

Wenn der Operator docker run --privileged ausführt, aktiviert Docker den Zugriff auf alle Geräte auf dem Host und legt einige Einstellungen in AppArmor oder SELinux fest, damit der Container fast den gleichen Zugriff auf den Host hat wie Prozesse, die außerhalb von Containern auf dem Host ausgeführt werden . Weitere Informationen zum Ausführen mit --privileged finden Sie im Docker-Blog.

sonjaya sonjaya
quelle
2
Können Sie Ihren Befehl und den Unterschied zur akzeptierten Frage erklären ?
Melebius
Willkommen bei AskUbuntu! Vielen Dank, dass Sie versuchen zu helfen! Eine schnelle Durchsicht der Dokumentation lässt mich glauben, dass Sie in diesem Befehl einen oder zwei Fehler gemacht haben. Wenn Sie so freundlich wären, es zu bearbeiten und zu erklären, was Sie tun und wie es das Problem löst, rufen Sie mich an und ich komme zurück und gebe Ihnen eine Gegenstimme!
Elder Geek
Wenn Sie images_docker sagen, meinen Sie das Vanille-Ubuntu: 16.04? Oder etwas anderes?
Parth Shah
1

Möglicherweise führen Sie nicht systemd aus. Dies ist die Standardimplementierung von init am 16.04. Wenn Sie von 14.04 aktualisiert hat , sind Sie wahrscheinlich noch läuft Emporkömmling , und das Ergebnis des laufenden systemctl Befehl ist die Ausgabe , die Sie bekommen.

Siehe meine Antwort unter systemctl: comand not found 16.04 server für mehr.

Hugh Buntu
quelle
Aber dies ist ein Ubuntu-Container, der standardmäßig kein systemd hat und keinen Upstart hätte.
Stefan Lasiewski
Was? Ubuntu hat Systemd standardmäßig
Knocte
Stefan: Ich glaube, du hast recht mit Docker.
Hugh Buntu
knocte: mein kommentar behandelt den fall des upgrades von 14.04 (upstart) auf 16.04 (systemd). Bei der Durchführung des Versions-Upgrades wird Upstart aus verständlichen Gründen nicht durch systemd ersetzt (z. B. um das System nicht zu beschädigen). Im Nachhinein stelle ich fest, dass der Release-Upgrade-Prozess in Docker nicht verwendet werden würde. Siehe den Link, den ich aufgerufen habe. Ich sehe, dass eine Reihe von Antworten und Kommentaren den speziellen Fall von Docker nicht berücksichtigen, und ich werde dies bei zukünftigen Antworten berücksichtigen.
Hugh Buntu
1

Starten Sie einfach den dbusDienst:

/etc/init.d/dbus start
moovs
quelle
0

Im Docker-Container können Sie, glaube ich, update-rc.d ausführen, wenn Sie immer noch Probleme mit systemd haben. Ich habe es mit update-rd.c versucht und es funktioniert.

NEERAJ SWARNKAR
quelle
0

Ich habe genau den gleichen Fehler erhalten und ihn dann erfolgreich mit ausgeführt sudo

sudo systemctl status ssh
Saif
quelle
1
das solltest du nicht brauchen sudo. Scheint ein Zufall zu sein. Kannst du bitte nochmal testen?
Zanna
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
Warum -1? Ich habe gerade gepostet, was für mich funktioniert hat.
Saif
Downvote war nicht meins ...
Zanna