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 start
moż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 run
na nowym obrazie z innego polecenia, ale zastanawiam się, czy są jakieś inne alternatywy.
Uwaga : docker logs
po prostu zwraca wszystko, co drukowane aplikacje, na stdout / stderr. To może nie wystarczyć, aby dowiedzieć się, na czym polega problem.
docker
containers
post-mortem
Sztuczki
źródło
źródło
Odpowiedzi:
Ogólne sposoby śledzenia, dlaczego proces w Linuksie nie powiódł się, są dobre. Jednym z takich sposobów jest uruchomienie procesu,
strace
który powie ci, że proces wywołań systemowych zrobił i zwykle wskazuje przyczynę niepowodzenia.Możesz stworzyć taki,
Dockerfile
który wygląda mniej więcej tak: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
tę-ff
opcję. Możesz również zmapować plik przy użyciu woluminów danych Docker i użyć-o
opcji od,strace
aby do niego zapisać. Ale ogólniestrace
pozostawia 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
źródło
docker commit
najpierw zatrzymać zatrzymany pojemnik, aby zacząć od zdjęciastrace
Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Użyj menedżera pakietów Alpine, aby go zainstalowaćapk install strace
.O ile mi wiadomo,
commit
i tutajrun
są 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 run
aby określić alternatywę--entrypoint
iCMD
. 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.źródło