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.

Mtmacdonald
źródło
„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)

Regan
źródło
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")
Larry Cai
źródło
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.

berto
źródło
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

Ashwin
źródło
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 :)

PiersyP
źródło
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 .

drzazga
źródło
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.

Alexis LEGROS
źródło
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.

agupta231
źródło
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)

Constantin Galbenu
źródło
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ć

tmac
źródło