Docker - kontener nie jest uruchomiony

88

Jestem zupełnie nowicjuszem w dockerze. Próbowałem uruchomić opuszczony kontener w następujący sposób,

  1. Wymieniłem wszystkie dostępne kontenery za pomocą docker ps -a. Zawierała następujące informacje:

    okno dokowane wyświetla wszystkie obrazy

  2. 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
    
  3. 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ę.

Nieznajomy
źródło
7
Cześć, czy możesz wyjaśnić, jak rozwiązałeś ten problem. Obawiam się, że poniższa odpowiedź nie ma
większego
4
@ApexFred, kontenery Dockera nie przypominają maszyn wirtualnych; są przeznaczone do uruchamiania aplikacji. Kiedy aplikacja kończy się, kontener również. W tym przypadku użytkownik ustawił „aplikację” dla kontenera na polecenie „echo”. Ponieważ polecenie „echo” wykonuje echo, a następnie kończy działanie, kontener również kończy się poleceniem. Jeśli ponownie uruchomi kontener, wykona echo i ponownie się zakończy. Polecenie EXEC wymaga działającego kontenera. Ponieważ kontener został zakończony, nie można go używać do uruchamiania dodatkowych poleceń.
channel_tape_coder

Odpowiedzi:

30

Pojemnik 79b3fa70b51dwydaje się wykonywać tylko plik echo.

Oznacza to, że uruchamia się, wyświetla echo, a następnie natychmiast zamyka.

Następne docker execpolecenie nie znalazłby go uruchomionego, aby dołączyć się do tego kontenera i wykonać dowolne polecenie: jest już za późno. Kontener już wyszedł.

docker execPolecenie uruchamia nową komendę w bieżących pojemniku.

Polecenie rozpoczęte za pomocą docker execzostanie uruchomione tylko wtedy, gdy jest uruchomiony główny proces kontenera (PID 1)

VonC
źródło
1
Hej VonC, dziękuję za komentarz. Jak mogę wejść do terminalu obrazu?
Stranger
3
@Udhayakumar docker run -it --rm udhayakumar/busyboxwithtouchDo 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.
VonC
50
Cześć, czy możesz wyjaśnić, jak rozwiązałeś ten problem. Obawiam się, że ta odpowiedź nie ma
większego
2
@Jawad Uruchamiając busyboxwithtouch bez żadnego parametru, domyślną powłoką jest interaktywna powłoka (która nie kończy się natychmiast). Oznacza to, że możesz później ( docker exec) dołączyć do niego.
VonC
61

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:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 
Dio Phung
źródło
22

Jeśli nie jest możliwe ponowne rozpoczęcie głównego procesu (przez wystarczająco długi czas), istnieje również możliwość commitprzeniesienia 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.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#
Matthias Kuhn
źródło
Wykonałem ten
1
Należy pamiętać, że polecenie uruchamia bashproces 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.
Matthias Kuhn
10

Przede wszystkim musimy uruchomić kontener docker

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Następnie sprawdź kontener docker:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Następnie wykonaj, używając poniższego polecenia:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 
Ankit gupta
źródło
Dobrze byłoby dodać tekst, który pomoże wyjaśnić twoją odpowiedź.
Lauren Van Sloun
9

Dzieje się tak w przypadku obrazów, dla których skrypt nie uruchamia usługi oczekującej na żądania , dlatego kontener jest zamykany na końcu skryptu.

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 :

docker run -it node /bin/bash

Wyjście jest

root@cacc7897a20c:/# echo $SHELL
/bin/bash
Michael P. Bazos
źródło
5

Oto, co zadziałało dla mnie.

Uzyskaj identyfikator kontenera i uruchom ponownie.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
zee
źródło
3

Powodem jest właśnie to, co powiedziała zaakceptowana odpowiedź. Dodaję dodatkowe informacje, które mogą pomóc w zrozumieniu tego problemu.

  1. Stan pojemnika zawiera Created, Running, Stopped, Exited, Deadi inni, co wiem.
  2. Kiedy wykonujemy docker create, demon docker utworzy kontener o statusie Created.
  3. Kiedy docker startdemon Dockera uruchomi istniejący kontener, którego może być status Createdlub Stopped.
  4. Kiedy wykonujemy docker run, docker daemon zakończy to w dwóch krokach: docker createi docker start.
  5. Kiedy docker stop, oczywiście, demon Dockera zatrzyma kontener. W ten sposób kontener miałby Stoppedstatus.
  6. Przechodząc do najważniejszego, pojemnik faktycznie wyobraża sobie, że przetrzymuje w nim długotrwały proces. Gdy proces kończy się, proces utrzymywania pojemnika również kończy się. Zatem status tego kontenera byłby Exited.

Kiedy kończy się proces? Innymi słowy, jaki jest proces, jak go rozpoczęliśmy?
Odpowiedź znajduje się CMDw pliku dockerfile lub commandw następującym wyrażeniu, które jest bashdomyślnie na niektórych obrazach, np. Ubutu: 18.04.

docker run ubuntu:18.04 [command]
Światło G.
źródło
2

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.

ldobson
źródło
2

docker run -it <image_id> /bin/bash

Uruchom w trybie interaktywnym, wykonując następnie powłokę bash

Syeda Arshiya
źródło
1
Myślę, że -dflaga jest tutaj literówką?
Ian Buss
1

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 ,

Zarówno instrukcje CMD, jak i ENTRYPOINT określają, jakie polecenie jest wykonywane podczas uruchamiania kontenera. ... Dockerfile powinien określać co najmniej jedno z poleceń CMD lub ENTRYPOINT.

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 ). Teraz bin/bash/polecenie może akceptować dane wejściowe, a docker run -it IMAGE_IDpolecenie 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_IDbędzie nie zapewniają interaktywny terminal w tym przypadku. Przykładem może być obraz Dockera zbudowany z poniższego pliku Docker-

FROM ubuntu
ENTRYPOINT echo hello 

Jeśli chcesz przejść do terminala tego obrazu, musisz utrzymać kontener w ruchu, modyfikując polecenie punktu wejścia.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Po normalnym uruchomieniu kontenera docker run IMAGE_ID, możesz po prostu przejść do innego terminala i użyć, docker exec -it CONTAINER_ID bashaby uzyskać terminal kontenera.

Sadman Sakib
źródło
„i możesz edytować plik Dockerfile”: kluczowy punkt tutaj. Głosowano za.
VonC
0

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.

Ross
źródło
0

Mam inne podejście do tego. Mogłem zrobić docker psi 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:

## [błąd] New-PSSession: wejściowy identyfikator kontenera xxx nie istnieje, ## [błąd] lub odpowiadający mu kontener nie jest uruchomiony.

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

AbsolutelyFreeWeb
źródło