Próbuję wyświetlić listę usług na moim obrazie CentOS uruchomionym w Dockerze przy użyciu
systemctl list-units
ale pojawia się ten komunikat o błędzie:
Failed to get D-Bus connection: Operation not permitted
Wszelkie sugestie na temat problemu?
sudo
?systemd
na CentOS, użyj tego obrazu:FROM centos/systemd
Odpowiedzi:
Domyślam się, że prowadzisz
non-privileged
kontener. systemd wymaga zdolności CAP_SYS_ADMIN, ale Docker upuszcza tę możliwość w nieuprzywilejowanych kontenerach, aby zwiększyć bezpieczeństwo.systemd wymaga również dostępu RO do systemu plików cgroup w kontenerze. Możesz to dodać za pomocą
–v /sys/fs/cgroup:/sys/fs/cgroup:ro
Oto kilka kroków, jak uruchomić CentOS z systemd wewnątrz kontenera Docker:
docker build --rm -t centos7-systemd - < mydockerfile
Uruchom kontener z
docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init
Powinieneś mieć system w swoim kontenerze
źródło
[ INFO ] Update UTMP about System Boot/Shutdown is not active. [DEPEND] Dependency failed for Update UTMP about System Runlevel Changes. Job systemd-update-utmp-runlevel.service/start failed with result 'dependency'. [ OK ] Started Journal Service. [ OK ] Reached target System Initialization. [ OK ] Reached target Timers. [ OK ] Listening on D-Bus System Message Bus Socket.
Failed to get D-Bus connection: Operation not permitted
/bin/bash
, aby uzyskać powłokę. Dało mi to jednak wspomniany wcześniej błąd. Kiedy uruchomiłem go/usr/sbin/init
zgodnie z sugestią, a następnie przymocowałem do skorupy wszystko poszło dobrze. Najwyraźniej brakuje mi niuansu na temat/usr/sbin/init
. Ta odpowiedź zasługuje na znaczną poprawę./sys/fs/cgroup:/sys/fs/cgroup
jest i skąd pochodzi ... Wiem, jak zamontować folder gościa w taki sposób:/src/:/var/www
ale skąd pochodzi twój plik? Powoduje to wiele błędów, ponieważTo nie jest bezpośrednia odpowiedź na twoje pytanie, ale w rzeczywistości może być ważniejsza i natknąłem się na to, czytając inne odpowiedzi tutaj.
Miałem trochę doświadczenia z migracją skomplikowanych systemów do Dockera, a jedną z ważniejszych realizacji, jakie miałem, jest to, że najlepiej mieć jeden kontener Docker na aplikację / usługę lub „na demona”.
Jednym z bardzo ważnych powodów jest to, że Docker nie zamknie czysto usług, które rozpoczynasz od systemctl aw rzeczywistości może dojść do tego samego rodzaju uszkodzeń bazy danych, które wynikają z nieoczekiwanego zaniku zasilania.
Aby zagłębić się w to nieco głębiej: kiedy Docker wydaje polecenie „stop” do kontenera, wysyła sygnał SIGTERM tylko jeden proces rozpoczęty za pomocą CMD / ENTRYPOINT, a nie do wszystkich usług i demonów. Tak więc jedna usługa ma ostrzeżenie, aby zamknąć w sposób czysty, a wszystkie pozostałe zostają bezceremonialnie zakończone.
Jeśli absolutnie musisz spakować dwie usługi w tym samym kontenerze (tj. Twoją aplikację i bazę danych PostgreSQL lub coś w tym rodzaju), musisz mieć CMD / ENTRYPOINT jako skrypt, który łapie SIGTERM, a następnie ponownie nadaje go do tych znanych usług. Można to zrobić, ale jeśli masz okazję, ponownie przemyśl swoje rozwiązanie i spróbuj rozbić je na wiele pojemników.
Dodatek
Na stronie Docker znajduje się interesująca notatka / strona o używaniu superwizora, jeśli absolutnie potrzebujesz mieć wiele usług działających w tym samym kontenerze.
źródło
Udało mi się naprawić ten problem w kontenerze dokującym CentOS: 7. Śledziłem głównie Przewodnik po projekcie obrazu CentOS Docker .
Teraz skompiluj obraz i uruchom go, używając przynajmniej następujących argumentów
docker run
:-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro
Zatem głównym punktem jest to, że
/usr/sbin/init
musi to być pierwszy proces w kontenerze Docker.Jeśli więc chcesz użyć niestandardowego skryptu, który wykonuje niektóre polecenia przed uruchomieniem
/usr/sbin/init
, uruchom go na końcu skryptu za pomocąexec /usr/sbin/init
(w skrypcie bash).Oto przykład:
A oto treść
cmd.sh
:Można mieć
System is booting up. See pam_nologin(8)
, jeśli używasz systemu PAM, w takim przypadku należy usunąć/usr/lib/tmpfiles.d/systemd-nologin.conf
w twojejDockerfile
ponieważ tworzy plik/var/run/nologin
, który generuje ten konkretny błąd.źródło
systemd-nologin.conf
/nologin
za wygraną, ponieważ roszczenia CentOS / RHEL 7UsePAM no
nie są obsługiwane i będą narzekać na dzienniki jako takie. Nie jestem pewien, czy RH openssh portable załatał / zepsuł się w jakiś sposób, czy starają się obniżyć powierzchnię wsparcia od początkujących klientów.Nie chciałem uruchamiać systemd jako init / PID 1. Po wykonaniu kroków czyszczenia wspomnianych przez innych, uruchamiam systemd ze skryptu startowego as
/usr/lib/systemd/systemd --system &
.To pozwoliło systemd na uruchomienie i uruchomienie zarejestrowanych usług, ale systemctl zawiódł z powodu błędu D-Bus.
Dla mnie brakującym linkiem był brak katalogu / run / systemd / system, który odkryłem, wprowadzając
strace
systemctl.Ręczne utworzenie tego katalogu przed uruchomieniem systemctl pozwala systemctl pracować dla mnie.
źródło