Prawidłowy sposób na odłączenie od pojemnika bez zatrzymywania go


313

W Docker 1.1.2 (najnowszym), jaki jest właściwy sposób na odłączenie od kontenera bez zatrzymywania go?

Na przykład, jeśli spróbuję:

  • docker run -i -t foo /bin/bash lub
  • docker attach foo (dla już uruchomionego kontenera)

oba prowadzą mnie do terminala w kontenerze, jak wyjść z terminala kontenera bez zatrzymywania go?

exiti CTR+Coba zatrzymują pojemnik.


„Kontener” to po prostu zestaw ograniczonych przestrzeni nazw (przestrzeń nazw procesu, przestrzeń nazw systemu plików itp.), W których procesy mogą się uruchamiać. Jeśli nie ma żadnego procesu wewnątrz przestrzeni nazw, to czy ta przestrzeń naprawdę istnieje? To nie jest jak wirtualna maszyna, na której jądro odbiera przerwania zegara i c. bez względu.
Charles Duffy,

Odpowiedzi:


166

Aktualizacja: Jak wspomniano w odpowiedziach poniżej Ctrl+ p, Ctrl+ qzmieni teraz tryb interaktywny w tryb demona.


Cóż Ctrl+ C(lub Ctrl+ \) powinien oderwać cię od kontenera, ale zabije kontener, ponieważ twoim głównym procesem jest bash.

Mała lekcja o dokerze. Kontener nie jest w pełni funkcjonalnym systemem operacyjnym. Po uruchomieniu kontenera uruchamiany jest proces, biorąc PID 1 i przyjmując moc inicjującą. Tak więc po zakończeniu tego procesu demon zatrzymuje kontener do momentu uruchomienia nowego procesu (poprzez uruchomienie dokera) (Więcej wyjaśnień na ten temat http://phusion.github.io/baseimage-docker/#intro )

Jeśli chcesz, aby kontener działał cały czas w trybie odłączonym, sugeruję skorzystanie z niego

docker run -d foo

Z serwerem ssh w kontenerze. (najłatwiej jest postępować zgodnie z samouczkiem dokowania otwierającym https://docs.docker.com/engine/examples/running_ssh_service/ )

Możesz też ponownie uruchomić swój kontener za pośrednictwem

docker start foo

(domyślnie zostanie odłączony)


3
+1 dla dokera podstawowego obrazu. Wspaniale jest wiedzieć, że istnieje szablon z poradami na temat trudnych części Dockera.
mtmacdonald

Pamiętaj, że ssh nie jest absolutnie konieczne: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat

1
uruchomienie trybu zawartego w trybie -d było bardzo pomocne. Link do uruchomienia ssh przez Dockerfile ułatwił mi życie.
Ravi

56
Odłącz za pomocą Ctrl-p, Ctrl-q. Ta rada zabije pojemnik.
taranaki,

4
To zadziałało dla mnie (wzięte z odpowiedzi poniżej): Zacznij od -ti -d, następnie dołącz z docker attach, następnie odłącz najpierw Ctrl + P, a następnie Ctrl + Q. Pomyślałem, że mogę użyć tylko jednego ze skrótów klawiaturowych.
CGFoX

526

Wpisz Ctrl+, pa następnie Ctrl+ q. Pomoże Ci przełączyć tryb interaktywny w tryb demona.

Zobacz https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell .

# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")

4
Wygląda na to, że nie działa z (próba wyjścia z dołączonego kontenera Wekan).
niebezpieczne89

7
Odwiedziłem tę stronę tak często, ponieważ nie pamiętałem dokładnie tej kombinacji klawiszy! :-D
Thamme Gowda

10
@ Niebezpieczeństwo89 ctrl-p, ctrl-q będzie działać tylko po uruchomieniu kontenera w trybie interaktywnym (-it). Jeśli uruchomiłeś go w trybie demona (-d) i do niego podłączyłeś, możesz po prostu wyjść z niego, a on nadal będzie działał w tle.
Riscie

1
@SlimShady naciśnij Ctrl + P, a następnie Ctrl + Q, aby wyjść, nie jeden z nich, ale oba w tej kolejności.
Mohyaddin Alaoddin

160

Wkopałem się w to i wszystkie powyższe odpowiedzi są częściowo poprawne. Wszystko zależy od sposobu uruchomienia kontenera. Po uruchomieniu kontenera sprowadza się do następujących kwestii:

  • został przydzielony przez TTY ( -t)
  • Stdin pozostało otwarte ( -i)

^P^Q działa, ale tylko wtedy, gdy -ti -ijest używany do uruchamiania pojemnika:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c działa, ALE tylko wtedy, gdy -t( bez -i ) zostanie użyty do uruchomienia kontenera:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d

[berto@g6]$ docker attach test
^C

[berto@g6]$    

Trzeci sposób na oderwanie się

Istnieje jednak sposób na odłączenie bez zabijania kontenera; potrzebujesz innej powłoki. Podsumowując, uruchomienie tego w innej powłoce zostało odłączone i pozostawiło kontener uruchomiony pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z

# go to another shell and run the `pkill` command above

# i'm back to my prompt
[berto@g6]$

Dlaczego? Ponieważ zabijasz proces, który połączył cię z kontenerem, a nie sam kontener.


2
trzeci sposób działa dla mnie. Dzięki. jeśli dołączasz się do kilku instancji i chcesz odłączyć się tylko od jednej. Może zabić określony proces: ps -ef | grep attach -> get pid. Następnie: zabij -9 <pid>
phanhuy152

pkill jest jedyną rzeczą, która działała dla mnie po dołączeniu
dokera

Dlaczego potrzebujemy -9. Zauważyłem, że jeśli nie użyjemy -9, zamknie on pojemnik.
Angelo,

Inne sygnały to takie, sygnały. Mówią procesowi, jaki rodzaj sygnału i dają mu szansę działania i zrobienia czegoś. kill -9Sygnał nie. Proces został zakończony i nie można się na niego odwołać. Domyślam się, że inne sygnały dają kontenerowi szansę na zamknięcie, podczas gdy -9nie.
berto

1
To było bardzo pomocne. Dzięki!
Evan Zamir

40

Jeśli wykonasz „docker attach” kontener id, wejdziesz do kontenera. Aby wyjść z kontenera bez zatrzymywania kontenera, musisz wpisać Ctrl+ P+Q


6
lepiej Ctrl + P i Ctrl + Q
sib10

4
Ctrl + P, Q (wciąż trzymając Ctrl);)
dimpiax

zwraca mi:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman

31

Uważam, że odpowiedź Ashwina jest najbardziej poprawna, moja stara odpowiedź jest poniżej.


Chciałbym tutaj dodać kolejną opcję, która polega na uruchomieniu kontenera w następujący sposób

docker run -dti foo bash

Następnie możesz wejść do kontenera i uruchomić bash za pomocą

docker exec -ti ID_of_foo bash

Nie musisz instalować sshd :)


Myślę, że w drugim poleceniu musisz zastąpić foo identyfikatorem kontenera foo
Nehal J Wani

W tym kontekście myślę, że docker attachbyłoby bardziej standardowe, poprzez ponowne podłączenie do pierwszego uruchomienia bash. docker execrównież tutaj działa, ale oprócz pierwszego tworzy nowy proces bash. Jasne, proces jest tworzony w tym samym kontekście / środowisku / kontenerze pierwszego, jednak jest inny (analogią byłoby otwarcie nowej karty terminala w ulubionym emulatorze terminali).
thiagowfx

20

Domyślnym sposobem odłączenia od kontenera interaktywnego jest Ctrl+ P Ctrl+ Q, ale można go zastąpić, uruchamiając nowy kontener lub podłączając do istniejącego kontenera za pomocą flagi --detach-keys .


16

Jeśli się połączyłeś docker attach, możesz się odłączyć, zabijając proces dołączania dokera. Lepszym sposobem jest użycie parametru sig-proxy, aby uniknąć przekazania Ctrl + C do kontenera:

docker attach --sig-proxy=false [container-name]

Ta sama opcja jest dostępna dla docker runpolecenia.


6
Chociaż --sig-proxy = false jest niezwykle przydatny, nie działa dla już podłączonych kontenerów, dla których nie został określony. Problem polega na tym, że po dołączeniu wydaje się, że NIE ma sposobu na odłączenie bez zabicia procesu, w tym „zabicie procesu dołączania dokera”. Cp, Cq nie działa z dołączonymi kontenerami, tylko interaktywnymi (podobnie jak w pytaniach).
taranaki

1
To powinna być zaakceptowana odpowiedź, łącznie z komentarzem @taranaki, Ctrl + P, Q nie działa dlaphp:7.3-apache
MKaama

10

Jeśli chcesz tylko zobaczyć wynik procesu uruchomionego z kontenera, możesz zrobić prosty docker container logs -f <container id>.

-fFlag czyni go tak, że wyjście z pojemnika followedi aktualizowane w czasie rzeczywistym. Bardzo przydatne do debugowania lub monitorowania.


8

Możesz użyć tej --detach-keysopcji po uruchomieniu, docker attachaby zastąpić domyślną sekwencję CTRL+ P, CTRL+ Q(to nie zawsze działa).

Na przykład, kiedy biegniesz docker attach --detach-keys="ctrl-a" testi naciśniesz CTRL+, Awyjdziesz z kontenera, nie zabijając go.

Inne przykłady:

  • docker attach --detach-keys="ctrl-a,x" test- naciśnij, CTRL+Aa następnie, Xaby wyjść
  • docker attach --detach-keys="a,b,c" test- naciśnij A, a następnie B, Caby wyjść

Wyciąg z oficjalnej dokumentacji:

Jeśli chcesz, możesz skonfigurować zastąpienie sekwencji klawiszy Docker dla odłączania. Jest to przydatne, jeśli domyślna sekwencja Dockera powoduje konflikt z sekwencją klawiszy używaną w innych aplikacjach. Istnieją dwa sposoby zdefiniowania własnej sekwencji odłączania klucza, jako zastąpienie dla kontenera lub jako właściwość konfiguracji dla całej konfiguracji.

Aby zastąpić sekwencję dla pojedynczego kontenera, użyj --detach-keys="<sequence>"flagi z komendą docker attach. Format <sequence>to albo litera [a-Z], albo ctrl-kombinacja z dowolnym z poniższych:

  • az (pojedynczy mały znak alfa)
  • @ (Na znaku)
  • [(lewy nawias)
  • \ (dwa ukośniki)
  • _ (podkreślenie)
  • ^ (karetka)

Te a, ctrl-a, Xczy ctrl-\\wartości są przykłady ważnych sekwencji klawiszy. Aby skonfigurować inną domyślną sekwencję kluczy dla wszystkich kontenerów, zobacz sekcję Plik konfiguracji .

Uwaga: Działa to od wersji dokera 1.10+ (w chwili tej odpowiedzi aktualna wersja to 18.03)


0

Stary post, ale po prostu wyjdź, a następnie uruchom go ponownie ... problem polega na tym, że jesteś na komputerze z systemem Windows Ctrl p lub Ctrl P są przywiązane do drukowania ... wyjście z kontenera nie powinno nic zaszkodzić

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.