Chciałbym uruchomić zatrzymany kontener Dockera za pomocą innego polecenia, ponieważ polecenie domyślne ulega awarii - co oznacza, że nie mogę uruchomić kontenera, a następnie użyć polecenia „docker exec”.
Zasadniczo chciałbym uruchomić powłokę, aby móc sprawdzić zawartość pojemnika.
Na szczęście utworzyłem kontener z opcją -it!
inspect
wyjściowe na konfigurację używaną przy kolejnym uruchomieniu?Edytuj ten plik (odpowiadający zatrzymanemu kontenerowi):
Zmień parametr „Ścieżka”, aby wskazywał na nowe polecenie, np. / Bin / bash. Możesz także ustawić parametr „Args”, aby przekazywać argumenty do polecenia.
Uruchom ponownie usługę dokowania (pamiętaj, że spowoduje to zatrzymanie wszystkich działających kontenerów):
Wyświetl listę kontenerów i upewnij się, że polecenie uległo zmianie:
Uruchom pojemnik i dołącz do niego, powinieneś być teraz w swojej skorupie!
Pracował na Fedorze 22 przy użyciu Docker 1.7.1.
UWAGA: Jeśli twoja powłoka nie jest interaktywna (np. Nie utworzyłeś oryginalnego kontenera z opcją -it), możesz zamiast tego zmienić polecenie na „/ bin / sleep 600” lub „/ bin / tail -f / dev / null” aby dać ci wystarczająco dużo czasu na wykonanie polecenia „docker exec -it CONTID / bin / bash” jako innego sposobu uzyskania powłoki.
UWAGA 2: Nowsze wersje dokera mają config.v2.json, gdzie trzeba będzie zmienić Entrypoint lub Cmd (dzięki user60561).
źródło
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
, gdzie będzie trzeba zmienić alboEntrypoint
alboCmd
.Dodaj zaznaczenie u góry skryptu Entrypoint
Docker naprawdę musi zaimplementować to jako nową funkcję, ale oto kolejna opcja obejścia sytuacji, w których masz punkt wejścia, który kończy się po sukcesie lub niepowodzeniu, co może utrudnić debugowanie.
Jeśli nie masz jeszcze skryptu Entrypoint, utwórz taki, który uruchamia dowolne polecenia dla twojego kontenera. Następnie u góry tego pliku dodaj te wiersze do
entrypoint.sh
:Aby upewnić się, że
cat
połączenie jest utrzymywane, konieczne może być podanie TTY. Korzystam z kontenera za pomocą skryptu Entrypoint w następujący sposób:Spowoduje to, że skrypt uruchomi się raz, tworząc plik wskazujący, że już się uruchomił (w wirtualnym systemie plików kontenera). Następnie możesz ponownie uruchomić kontener, aby przeprowadzić debugowanie:
Po ponownym uruchomieniu kontenera
already_ran
plik zostanie znaleziony, co spowoduje zatrzymanie skryptu Entrypointcat
(który po prostu czeka wiecznie na dane wejściowe, które nigdy nie nadejdą, ale utrzymują kontener przy życiu). Następnie możesz wykonaćbash
sesję debugowania :Podczas działania kontenera możesz również usunąć
already_ran
i ręcznie uruchomićentrypoint.sh
skrypt, aby go ponownie uruchomić, jeśli chcesz w ten sposób debugować.źródło
/bin/sh
zamiastcat
- wtedy zawsze możesz się zrestartować. Twoje rozwiązanie rządzi!Mój problem:
docker run <IMAGE_NAME>
docker ps -a
, widziałem dwa pojemniki.docker run <IMAGE_NAME>
polecenie, tworzony jest nowy obrazRozwiązanie: Aby pracować na tym samym kontenerze, który utworzyłeś w pierwszej kolejności, wykonaj następujące kroki
docker ps
aby dostać pojemnik swojego pojemnikadocker container start <CONTAINER_ID>
aby uruchomić istniejący kontenerdocker exec -it <CONTAINER_ID> /bin/bash
źródło
docker run <containerID>
Wziąłem odpowiedź @ Dmitriusana i przekształciłem ją w alias:
Dodaj to do
~/.bashrc
pliku aliasów, a będziesz miał nowy,docker-run-prev-container
sprytny alias, który przeniesie Cię do powłoki w poprzednim kontenerze.Przydatne dla debugowania nieudane
docker build
s.źródło
Nie jest to dokładnie to, o co prosisz, ale możesz użyć
docker export
zatrzymanego kontenera, jeśli wszystko, czego chcesz, to sprawdzić pliki.źródło
Nie określono, czy kontener się kończy, tylko że kod ulega awarii i musisz zobaczyć, co się dzieje w kontenerze. Jeśli nie wychodzi, oto inne potencjalne rozwiązanie.
Uzyskaj identyfikator kontenera za pomocą
docker ps
docker exec -it 665b4a1e17b6 /bin/sh
Jeśli punkt wejścia jest ustawiony na coś problematycznego, można go również zastąpić, jak sugeruje odpowiedź Dmitriusan. Należy również zauważyć, że można dołączyć do dowolnego działającego kontenera za pomocą
docker attach
. Tak wiele rozwiązań, różne rozwiązania. Po prostu nie widzę potrzeby angażowania się w obraz. To wydaje się niepotrzebne.Dokumenty dla Docker exec - https://docs.docker.com/engine/reference/commandline/exec/
Dołącz Dokumenty do Dockera - https://docs.docker.com/engine/reference/commandline/attach/
źródło
Właściwie nie zgadzam się z obiema tymi odpowiedziami. Jeśli chcesz tylko zobaczyć, co jest w kontenerze, możesz uruchomić to polecenie, aby uzyskać powłokę. Nie ma potrzeby zmiany punktu wejścia ani żadnej konfiguracji.
źródło
docker logs <container_id> --follow
otrzymasz to, czego potrzebujesz. Inną alternatywą jest użycie powyższego polecenia, a następnie uruchomienie usługi awarii na tym obrazie za pomocą tego samego polecenia w pliku dokera i stamtąd debugowanie.źródło