Jestem zupełnie nowicjuszem w dockerze. Próbowałem uruchomić opuszczony kontener w następujący sposób,
Wymieniłem wszystkie dostępne kontenery za pomocą
docker ps -a
. Zawierała następujące informacje:Wpisałem następujące polecenia, aby uruchomić kontener, który jest w opuszczonej scenie i wejść do terminala tego obrazu.
docker start 79b3fa70b51d docker exec -it 79b3fa70b51d /bin/sh
Zgłasza następujący błąd.
FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running
Ale kiedy zacznę używać kontenera docker start 79b3fa70b51d
. Wyrzuca identyfikator kontenera jako dane wyjściowe, co jest normalne, jeśli wszystko działa normalnie. Nie jestem pewien, co powoduje ten błąd. Jakiekolwiek wyobrażenie o przyczynach i sugestie na ten temat byłyby dla mnie bardzo pomocne. Z góry dziękuję.
docker
docker-container
Nieznajomy
źródło
źródło
Odpowiedzi:
Pojemnik
79b3fa70b51d
wydaje się wykonywać tylko plikecho
.Oznacza to, że uruchamia się, wyświetla echo, a następnie natychmiast zamyka.
Następne
docker exec
polecenie nie znalazłby go uruchomionego, aby dołączyć się do tego kontenera i wykonać dowolne polecenie: jest już za późno. Kontener już wyszedł.źródło
docker run -it --rm udhayakumar/busyboxwithtouch
Do otwarcia sesji powinno wystarczyć proste . Domyślnym punktem wejścia powinien być / bin / sh, ale zależy to od twojego pliku Dockerfile: możesz zdefiniować inny punkt wejścia i / lub inny CMD.docker exec
) dołączyć do niego.Domyślnie kontener Docker zostanie zamknięty natychmiast, jeśli nie masz uruchomionego żadnego zadania w kontenerze.
Aby kontener działał w tle, spróbuj uruchomić go z argumentem
--detach
(lub-d
).Dla przykładów:
źródło
Jeśli nie jest możliwe ponowne rozpoczęcie głównego procesu (przez wystarczająco długi czas), istnieje również możliwość
commit
przeniesienia kontenera do nowego obrazu i uruchomienia nowego kontenera z tego obrazu. Chociaż nie jest to zwykły przepływ pracy z najlepszymi praktykami , uważam, że naprawdę przydatne jest od czasu do czasu debugowanie błędnego skryptu.źródło
bash
proces w kontenerze. Prawdopodobnie już wcześniej działał serwer WWW, więc będziesz musiał sprawdzić, którego polecenia należy użyć do przywrócenia serwera.Przede wszystkim musimy uruchomić kontener docker
Następnie sprawdź kontener docker:
Następnie wykonaj, używając poniższego polecenia:
źródło
Dzieje się tak zwykle w przypadku większości podstawowych obrazów systemu operacyjnego (centos, debian itp.), A także w przypadku obrazów węzłów .
Najlepiej jest uruchomić obraz w trybie interaktywnym . Przykład poniżej z obrazem węzła :
Wyjście jest
root@cacc7897a20c:/# echo $SHELL /bin/bash
źródło
Oto, co zadziałało dla mnie.
Uzyskaj identyfikator kontenera i uruchom ponownie.
źródło
Powodem jest właśnie to, co powiedziała zaakceptowana odpowiedź. Dodaję dodatkowe informacje, które mogą pomóc w zrozumieniu tego problemu.
Created
,Running
,Stopped
,Exited
,Dead
i inni, co wiem.docker create
, demon docker utworzy kontener o statusieCreated
.docker start
demon Dockera uruchomi istniejący kontener, którego może być statusCreated
lubStopped
.docker run
, docker daemon zakończy to w dwóch krokach:docker create
idocker start
.docker stop
, oczywiście, demon Dockera zatrzyma kontener. W ten sposób kontener miałbyStopped
status.Exited
.Kiedy kończy się proces? Innymi słowy, jaki jest proces, jak go rozpoczęliśmy?
Odpowiedź znajduje się
CMD
w pliku dockerfile lubcommand
w następującym wyrażeniu, które jestbash
domyślnie na niektórych obrazach, np. Ubutu: 18.04.źródło
Zostało to opublikowane przez L0j1k w poniższym poście i działało dla mnie.
Jak dostać się do powłoki kontenera Dockera?
źródło
Dla każdego, kto próbuje czegoś podobnego za pomocą pliku Dockerfile ...
Bieganie w trybie odłączonym nie pomoże. Kontener zawsze zakończy działanie (przestanie działać), jeśli polecenie nie blokuje, tak jest w przypadku bash.
W tym przypadku obejściem byłoby: 1. Zatwierdź wynikowy obraz: (nazwa_kontenera = nazwa kontenera, na którym chcesz oprzeć obraz, nazwa_obrazu = nazwa tworzonego obrazu docker commit nazwa_kontenera nazwa_obrazu 2. Użyj docker run, aby utworzyć nowy kontener przy użyciu nowego obrazu, określając polecenie, które chcesz uruchomić. Tutaj uruchomię "bash": docker run -it nazwa_obrazu bash
W ten sposób uzyskasz interaktywny login, którego szukasz.
źródło
docker run -it <image_id> /bin/bash
Uruchom w trybie interaktywnym, wykonując następnie powłokę bash
źródło
-d
flaga jest tutaj literówką?Oto rozwiązanie, gdy kontener Docker kończy normalne działanie i można edytować plik Dockerfile.
Generalnie, gdy uruchamiany jest kontener docker, aplikacja jest obsługiwana przez uruchomienie polecenia. Z odwołania do pliku Dockerfile ,
Gdy tworzysz obraz i nie określasz żadnego polecenia z CMD lub ENTRYPOINT, zostanie wykonane polecenie CMD lub ENTRYPOINT obrazu podstawowego.
Na przykład oficjalny plik Docker dla Ubuntu ma
CMD ["/bin/bash"]
( https://hub.docker.com/_/ubuntu ). Terazbin/bash/
polecenie może akceptować dane wejściowe, adocker run -it IMAGE_ID
polecenie dołącza STDIN do kontenera. W rezultacie otrzymujesz interaktywny terminal, a kontener nadal działa.Gdy polecenie z CMD lub ENTRYPOINT jest określone w pliku Dockerfile, to polecenie jest wykonywane podczas uruchamiania kontenera. Teraz, jeśli to polecenie może zakończyć się bez konieczności wprowadzania jakichkolwiek danych, zakończy się i kontener zostanie zamknięty.
docker run -it IMAGE_ID
będzie nie zapewniają interaktywny terminal w tym przypadku. Przykładem może być obraz Dockera zbudowany z poniższego pliku Docker-Jeśli chcesz przejść do terminala tego obrazu, musisz utrzymać kontener w ruchu, modyfikując polecenie punktu wejścia.
Po normalnym uruchomieniu kontenera
docker run IMAGE_ID
, możesz po prostu przejść do innego terminala i użyć,docker exec -it CONTAINER_ID bash
aby uzyskać terminal kontenera.źródło
W moim przypadku zmieniłem niektóre nazwy plików i nazwy katalogów w katalogu nadrzędnym pliku Dockerfile. Przez co kontener nie znajduje wymaganych parametrów, aby go ponownie uruchomić.
Po zmianie nazwy z powrotem na oryginalne, pojemnik zaczął się jak masło.
źródło
Mam inne podejście do tego. Mogłem zrobić
docker ps
i zobaczyć, że jest uruchomiony kontener docker, nawet próbowałem go zrestartować, ale gdy tylko spróbowałem uzyskać dla niego sesjęNew-PSSession -ContainerId $containerId -RunAsAdministrator
, wyskoczyłby błąd, mówiąc:Mój problem polegał na tym, że korzystałem z usługi sieciowej i nie miałem wystarczających uprawnień, aby zobaczyć kontener, mimo że nadałem mu uprawnienia do uruchamiania poleceń dockera (z konfiguracją grupy zabezpieczeń docker)
Nie wiedziałem, jak włączyć pracę z kontenerami, więc zamiast tego musiałem wrócić do uruchamiania go jako administrator
źródło