Jak zbadać główny proces, który zmarł w pojemniku dokowanym?

13

Czasami musisz zbadać pojemnik, który jest zatrzymany lub pojemnik, który po uruchomieniu umiera bardzo szybko i zatrzymuje się.

docker exec -ti <id> bash działa tylko na uruchomionych kontenerach, po jego zakończeniu monit bash również się kończy.

Nie docker startmożesz podać innej komendy, a jeśli pojemnik nagle umrze nagle, nie będziesz miał czasu, aby dostać się do kontenera i przeprowadzić dochodzenie.

Możemy to zrobić docker commit, a następnie docker runna nowym obrazie z innego polecenia, ale zastanawiam się, czy są jakieś inne alternatywy.

Uwaga : docker logspo prostu zwraca wszystko, co drukowane aplikacje, na stdout / stderr. To może nie wystarczyć, aby dowiedzieć się, na czym polega problem.

Sztuczki
źródło
Po chwili zastanowienia: główny proces dokowania ???? Ponieważ kontener ma na celu uruchomienie tylko jednego procesu, albo należy usunąć termin „główny”, albo robisz coś dziwnego (na przykład uruchamianie procesu init), albo bierzesz wątki jako procesy ... Zakładam, że to opcja pierwsza, ale musiałem to powiedzieć, bo mi to przeszkadza
Tensibai
@Tensibai czasami trzeba uruchomić coś takiego jak głupi-init, aby poradzić sobie z problemem sygnalizowania pid 1 / w kontenerach, jeśli twoje główne polecenie nie jest w stanie sam sobie z tym poradzić. Mogą też występować inne przypadki, w których kontener dokerów uruchamia więcej niż jeden proces
SztupY
Tak, to nazywam dziwne, głównie dlatego, że pojemniki zostały wykonane w celu izolacji procesu. Czasami pojemniki nie są rozwiązaniem dla aplikacji, a chęć umieszczenia wszystkiego w pojemniku jest bardziej ścieżką do bólu głowy niż cokolwiek innego.
Tensibai

Odpowiedzi:

9

Ogólne sposoby śledzenia, dlaczego proces w Linuksie nie powiódł się, są dobre. Jednym z takich sposobów jest uruchomienie procesu, stracektóry powie ci, że proces wywołań systemowych zrobił i zwykle wskazuje przyczynę niepowodzenia.

Możesz stworzyć taki, Dockerfilektóry wygląda mniej więcej tak:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

Następnie uruchom nowy obraz za pomocą docker run debug_version strace original_cmd.

W przypadku procesów, które rozwidlają dzieci (a następnie umierają), chcesz uruchomić strace-ffopcję. Możesz również zmapować plik przy użyciu woluminów danych Docker i użyć -oopcji od, straceaby do niego zapisać. Ale ogólnie stracepozostawia wyjście na standardowym wyjściu, co można odczytać za pomocą docker log.

Powiązane pytanie: Proces Linux kończy się w tajemniczy sposób

Evgeny
źródło
Oznacza to, że muszę docker commitnajpierw zatrzymać zatrzymany pojemnik, aby zacząć od zdjęcia
SztupY
Powiedziałeś, że umiera na początku. Zakładam, że masz wtedy obraz. Dla tych, którzy są zatrzymani, tak, zatwierdzenie jest wymagane.
Evgeny,
To tylko jeden ze scenariuszy uzyskania zatrzymanego kontenera
SztupY
Istnieje również pakiet dla straceAlpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Użyj menedżera pakietów Alpine, aby go zainstalować apk install strace.
Evgeny,
3

O ile mi wiadomo, commiti tutaj runsą najlepsze opcje, aby dać ci pełny dostęp do kontenera, tak jak wtedy, kiedy zmarł.

Idealnie byłoby, gdyby Twój pojemnik wyrzucił kilka bardziej przydatnych informacji, gdy się nie powiedzie, ale to zupełnie inny temat.

Edycja: aby rozszerzyć moją odpowiedź, jeśli pojemnik umiera od razu, możesz również użyć, docker runaby określić alternatywę --entrypointi CMD. Ogólnie ustawię to na pętlę lub coś, co samo nie wyjdzie. Gdy znajdziesz się w kontenerze, możesz ręcznie uruchomić kroki, które kończą się niepowodzeniem, a następnie sprawdzić wynik bez martwienia się o zamknięcie kontenera.

tayworm
źródło