systemctl nie może połączyć się z kontenerem bus-docker ubuntu: 16.04

72

Próbuję użyć systemctlpolecenia w ubuntu:16.04kontenerze dokowanym. Korzystam z następującego polecenia ...

systemctl status ssh

Jednak pojawia się błąd ...

Failed to connect to bus: No such file or directory

Dlaczego to nie działa? Czy ma to związek z uruchomieniem Ubuntu w kontenerze dokowanym? Jak mogę systemctlprawidłowo działać?

Duncan Gravill
źródło
2
Użyjservice ssh start
Bidyut

Odpowiedzi:

50

Zakładam, że zaczynasz swój kontener dokerów czymś takim

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

Problem polega teraz na tym, że proces inicjacji PID 1 /bin/bashnie jest systemowy. Potwierdź za pomocą ps aux.

Oprócz tego brakuje ci dbus, który byłby sposobem na komunikację. Stąd pochodzi komunikat o błędzie. Ale ponieważ twój PID 1 nie jest systemowy, nie pomoże zainstalować dbus.

Najlepiej byłoby przemyśleć sposób, w jaki planujesz używać dokera. Nie polegaj na systemd jako menedżerze procesów, ale pozwól kontenerowi dokera uruchomić żądaną aplikację na pierwszym planie.

użytkownik228505
źródło
Usługi takie jak openssh-server są skonfigurowane do logowania do domyślnej funkcji syslog. Jak mogę uzyskać dzienniki sshd bez polegania na systemctl?
Parth Shah,
@ParthShah sprawdź stronę podręcznika sshd. Mój ma następujące opcje: Caling go za pomocą -D możesz utrzymać go na pierwszym planie. przy pomocy -e instruujesz go, aby bezpośrednio drukował dzienniki. można je później sprawdzić za pomocą dokera docker log.
user228505,
[FYI] otrzymywał ten błąd, /sbin/initponieważ był to proces PID = 1. Dodanie --privileged=truezgodnie z sugestią @sonjaya sonjaya poniżej rozwiązało problem.
DimG
piękna odpowiedź !!
Sachin Verma
11

Inni zgłosili podobny problem. Uruchom terminal i wpisz:

$ env

Czy widzisz taką zmienną środowiskową?

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

Gdzie id -ujest ujęte w backtyki, a nie pojedyncze cytaty. Ta zmienna jest ponownie interpretowana na liczbę zwykle 1000dla zwykłych użytkowników i 0superużytkowników (sudo).

Jeśli zmienna środowiskowa XDG_RUNTIME_DIRnie istnieje, musisz ją utworzyć. Pełna dyskusja znajduje się w odpowiedziach systemowych startera .

WinEunuuchs2Unix
źródło
2
Próbowałem tego bez powodzenia. Ponieważ moja instancja Ubuntu 16.04 ma postać kontenera dokującego i nie skonfigurowałem żadnych użytkowników, pracuję jako root, więc użyłem zmiennej XDG_RUNTIME_DIR=/run/root/0bez powodzenia. Następnie sprawdziłem folder /runi stwierdziłem, że nie ma podfolderu /run/root. Czy w każdym razie mogę uzyskać bardziej szczegółowy komunikat o błędzie? Spojrzałem na, systemctl --helpale nie widziałem sposobu na uzyskanie szczegółowych komunikatów o błędach.
Duncan Gravill,
1
Mam ten sam problem i to również nie rozwiązało mojego problemu. Czy zdarzyło ci się kiedyś to wymyślić @DuncanGravill
Roeland
3
@Roeland Tak. Zadałem podobne pytanie na temat SO, które miało silniejszą odpowiedź. Polecam także obejrzenie samouczków w witrynie Docker. W tych filmach wyjaśniono (nieco niejasno), w jaki sposób PID 1zwykle systemdzastępuje się go w kontenerze Docker z punktem wejścia kontenera .
Duncan Gravill
Świetnie, dziękuję! Potrzebowałem tego, aby uruchomić / zarządzać jednostką użytkownika z jednostki systemowej.
Adrian Günter,
5

Jeśli pojawia się ten błąd w podsystemie Windows dla systemu Linux (WSL), stwierdziłem, że jest to spowodowane tym, że Docker nie jest obsługiwany. Wynika to z braku grup i innych wymagań wstępnych.

ijustlovemath
źródło
3

Spróbuj tego:

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

lub

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

będzie taki sam wynik.

Oto dokument Dockera :

Domyślnie kontenery Docker są „nieuprzywilejowane” i nie mogą na przykład uruchomić demona Docker wewnątrz kontenera Docker. Jest tak, ponieważ domyślnie kontener nie ma dostępu do żadnych urządzeń, ale kontener „uprzywilejowany” ma dostęp do wszystkich urządzeń (patrz dokumentacja urządzeń cgroups).

Gdy operator uruchomi okno dokowane - uprzywilejowane, Docker umożliwi dostęp do wszystkich urządzeń na hoście, a także ustawi konfigurację w AppArmor lub SELinux, aby umożliwić kontenerowi prawie taki sam dostęp do hosta, jak procesy działające poza kontenerami na hoście . Dodatkowe informacje na temat uruchamiania z --privileged są dostępne na blogu Docker.

sonjaya sonjaya
źródło
2
Czy możesz wyjaśnić swoje polecenie i różnicę w zaakceptowanym pytaniu ?
Melebius
Witamy w AskUbuntu! Dziękujemy za próbę pomocy! Szybki przegląd dokumentacji prowadzi mnie do wniosku, że mógłbyś popełnić błąd lub 2 w tym poleceniu. Jeśli byłbyś tak miły, aby go edytować i wyjaśnić, co robisz i jak to rozwiązuje problem, napisz do mnie, a wrócę i oddam ci głos!
Starszy Geek
Kiedy mówisz images_docker, masz na myśli waniliowe ubuntu: 16.04? Albo coś innego?
Parth Shah,
1

Być może nie działa systemd , co jest domyślną implementacją init 16.04. W przypadku uaktualnienia z 14.04, jesteś najprawdopodobniej nadal działa dorobkiewicz , a wynik uruchamiając systemctl polecenia jest wyjście masz.

Zobacz moją odpowiedź na stronie systemctl: komenda nie znaleziono serwera 16.04 więcej.

Hugh Buntu
źródło
Ale to jest kontener Ubuntu, który domyślnie nie ma systemowego i nie miałby aktualizacji.
Stefan Lasiewski
co? ubuntu ma domyślnie
systemd
Stefan: Uważam, że masz rację w przypadku Dockera.
Hugh Buntu,
knocte: mój komentarz dotyczy przypadku aktualizacji z 14.04 (Upstart) do 16.04 (systemd). Podczas przeprowadzania aktualizacji wersji Upstart nie jest zastępowany przez systemd ze zrozumiałych powodów (takich jak: nie uszkodzenie systemu). Patrząc wstecz, zdaję sobie sprawę, że proces aktualizacji wersji nie byłby używany w Dockerze. Zobacz link, który wywołałem. Widzę, że wiele odpowiedzi i komentarzy nie uwzględnia konkretnego przypadku Dockera, i szukam tego, odpowiadając w przyszłości.
Hugh Buntu,
1

Po prostu uruchom dbususługę:

/etc/init.d/dbus start
moovs
źródło
0

Wewnątrz kontenera dokerów, myślę, że możesz zaktualizować-rc.d, jeśli nadal masz problemy z systemd. Próbowałem z update-rd.c i działa.

NEERAJ SWARNKAR
źródło
0

Otrzymałem dokładnie ten sam błąd, a następnie pomyślnie go uruchomiłem sudo

sudo systemctl status ssh
Saif
źródło
1
nie powinieneś tego potrzebować sudo. Wygląda na zbieg okoliczności. Czy możesz powtórzyć test?
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
Dlaczego -1? Właśnie opublikowałem to, co dla mnie zadziałało.
Saif
downvote nie było moje ...
Zanna,