Jak dołączyć i odłączyć się od procesu Dockera?

456

Mogę dołączyć do procesu dokowania, ale Ctrl+ cnie działa, aby się od niego odłączyć. exitw zasadzie zatrzymuje proces.

Jaki jest zalecany przepływ pracy, aby proces działał, czasami dołączając się do niego, aby wprowadzić pewne zmiany, a następnie odłączając?

MarkL
źródło
4
Kiedy używam nsenter, po prostu Ctrl-D.
user2105103
Czy zamknięcie xterm, konsoleitp pracę? To działa dla mnie (jestem odłączony).
Vytenis Bivainis

Odpowiedzi:

666

Aby odłączyć tty bez wychodzenia z powłoki, użyj sekwencji ucieczki Ctrl+, Pa następnie Ctrl+ Q. Więcej informacji tutaj .

Dodatkowe informacje z tego źródła :

  • okno dokowane uruchomione -t -i → można odłączyć ^P^Qi ponownie podłączyć za pomocą narzędzia docker attach
  • uruchomienie dokera -i → nie można odłączyć za pomocą ^P^Q; zakłóci standardowe wejście
  • uruchomienie dokera → nie można go odłączyć ^P^Q; czy klient SIGKILL; można ponownie podłączyć za pomocą narzędzia dokującego
Ken Cochrane
źródło
46
Byłaby to świetna odpowiedź, gdyby faktycznie działała zgodnie z opisem w dokumentacji.
allingeek
20
Odkryłem, że nawet podczas działania z opcją -it sekwencja odłączania kończy się niepowodzeniem, jeśli również uruchomisz kontener z flagą czyszczenia (--rm). Dla niektórych może to być oczywiste, ale gryzie mnie częściej, niż chciałbym przyznać.
allingeek
7
Inną opcją jest po prostu zamknięcie okna terminala lub cmd-w :)
buildmaestro
3
Można ustawić konfigurowalne klucze odłączania np. "detachKeys": "ctrl-a,a"W pliku .docker / config.json lub --detach-keys "ctrl-a,a"w wierszu poleceń z załącznikiem itp.
Matthew Hannigan
4
Ctrl + Znie odłącza się; to tylko tło procesu. To nie to samo, co odłączanie i pociąga za sobą karę wydajności.
Zenexer
177

Zapoznaj się również z --sig-proxyopcji :

docker attach --sig-proxy=false 304f5db405ec

Następnie użyj CTRL+, caby odłączyć

czerasz
źródło
4
Aby spróbować, zaczynając od uruchomienia zamiast załączania, próbowałem: docker run -ti --sig-proxy=false busybox top co wydaje się nie działać, proces jest zabijany za pomocą ctrl-c, ale zaczynając od docker run -t -sig-proxy=false busybox top wydaje się działać i umożliwia zamknięcie za pomocą ctrl-c
Henning
Ctrl-czatrzyma również pojemnik.
Evan Hu
Jest to jedyne rozwiązanie z wymienionych tutaj, które działa dla mnie na serwerze Debian 9 z systemem Docker 19.03.5. Pytanie brzmi, dlaczego nie jest to domyślne ustawienie poleceń dołączania? Wydaje się, że jest to najczęstszy przypadek użycia.
fviktor,
Sekwencje Ctrl-p, Ctrl-q nie działają dla mnie (rozpoczęte jako kontener dokujący dołącz xyz) .. ale to działa. Dzięki @czerasz
PravyNandas
92

Jeśli chcesz tylko zmodyfikować pliki lub sprawdzić procesy, oto inne rozwiązanie, które prawdopodobnie chcesz.

Możesz uruchomić następującą komendę, aby wykonać nowy proces z istniejącego kontenera:

sudo docker exec -ti [CONTAINER-ID] bash

rozpocznie nowy proces z powłoką bash, i możesz od niego uciec bezpośrednio Ctrl+ C, nie wpłynie to na oryginalny proces.

Colin Su
źródło
6
To zadziałało, możesz wpisać „exit”, gdy skończysz, bez wpływu na oryginalny proces.
Eko3alpha
To świetny sposób na dołączenie do działającego kontenera. Ale co jeśli (powiedzmy), że mam jakiś proces uruchomiony w kontenerze i chcę go ponownie uruchomić? Ach, mogę po prostu zabić stary proces, zrestartować nowy i użyć Cp, Cq, który działa, ponieważ jest to interaktywny tty. Podoba mi się również --sig-proxy = false, ale jest to bardziej uniwersalne i nie wymusza zakłócania bieżącego procesu.
taranaki
„dołącz” ma określone znaczenie w Dockerze, a execnie jest nim.
frnhr
48

Myślę, że powinno to zależeć od sytuacji. Weź jako przykład następujący kontener:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) Użyj „ docker attach”, aby przymocować pojemnik:

Ponieważ „ docker attachnie przydzieli nowego tty, ale użyje ponownie oryginalnego działającego tty, więc jeśli uruchomisz exitpolecenie, spowoduje to wyjście z uruchomionego kontenera:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

Więc jeśli naprawdę nie chcesz, aby działający kontener był zamykany, powinieneś użyć Ctrl+ p+ Ctrl+ q.

(2) Użyj „ docker exec

Ponieważ „ docker execbędzie przeznaczyć nowy tty, więc myślę, że należy użyć exitzamiast Ctrl+ p+ Ctrl+ q.

Wykonuje Ctrl+ p+ Ctrl+, qaby wyjść z kontenera:

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

Następnie zaloguj się ponownie, zobaczysz, że bashproces w poprzedniej docker execkomendzie jest nadal aktywny (PID to 15):

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29
Nan Xiao
źródło
39

Aby odłączyć od uruchomionego pojemnika, użyj ^P^Q(przytrzymaj Ctrl, naciśnij P, naciśnij Q, zwolnij Ctrl).

Jest pewien haczyk: działa to tylko wtedy, gdy kontener został uruchomiony z obu -t i -i.

Jeśli masz działający kontener, który został uruchomiony bez jednej (lub obu) tych opcji, i dołączasz się docker attach, musisz znaleźć inny sposób na odłączenie. W zależności od wybranych opcji i uruchomionego programu,^C może działać lub zabijać cały kontener. Będziesz musiał eksperymentować.

Kolejny haczyk: w zależności od używanych programów, terminal, powłoka, klient SSH lub multiplekser mogą przechwytywać jeden ^Plub ^Qdrugi (zwykle ten drugi). Aby sprawdzić, czy to jest problem, spróbuj uruchomić lub dołączyć za pomocą --detach-keys zargumentu. Powinieneś być teraz w stanie odłączyć, naciskając z, bez żadnych modyfikatorów. Jeśli to zadziała, inny program zakłóca. Najłatwiejszym sposobem obejścia tego problemu jest ustawienie własnej sekwencji odłączania za pomocą argumentu. (Na przykład, aby wyjść , użyj .) Alternatywnie możesz spróbować wyłączyć przechwytywanie kluczy w twoim terminalu lub innym zakłócającym programie. Na przykład lub może uniemożliwić przechwycenie terminala w niektórych systemach POSIX, chociaż nie uważam tego za pomocne.--detach-keys^K--detach-keys 'ctrl-k'stty start ''stty start undef^Q

Zenexer
źródło
2
Bardzo precyzyjne wyjaśnienie, działało jak urok
Meir Gabay
27

gdy nic innego nie działa, otwórz nowy terminal, a następnie:

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>
Adi Fatol
źródło
Co za pułapka! Dziękuję, to jedyna rzecz, która zadziałała. -9nie było konieczne.
Heath Raftery
To także zabija kontener - być może zależne od tego, które flagi zostały ustawione.
AdamAL
1
Uwaga: jeśli wyświetlane są dwie oferty, pierwsza z nich to rodzic. Powinieneś użyć drugiego pid do zabicia, docker attacha nie jego rodzica.
joeytwiddle
11

Aby odłączyć od pojemnika, wystarczy przytrzymać Ctrli nacisnąć P+ Q.

Aby dołączyć do działającego kontenera, użyj:

$ docker container attach "container_name"
gXg
źródło
9

Miałem ten sam problem ctrl- Pi Qnie działało, ani ctrl- C... w końcu otworzyłem kolejną sesję terminalową i zrobiłem „docker stop containerid ” i „docker start containerid ” i to załatwiło sprawę. Dziwne.

Pierluigi Vernetto
źródło
To nie zadziała, jeśli uruchomiłeś kontener z --rmflagą. Ctrl+Pi Ctrl+Qdziała, jeśli kontener został uruchomiony z -itflagą.
Aswath K,
4

W tej samej powłoki, przytrzymaj ctrlklawisz i naciśnij klawisze pnastępnieq

ravthiru
źródło
3
Działa to tylko wtedy, gdy kontener został uruchomiony z -itflagą.
Aswath K,
2

Jestem na komputerze Mac i z jakiegoś powodu Ctrl- p Ctrl- qdziałałbym tylko wtedy, gdybym to zrobiłShift

Jared Williams
źródło
1
  1. Otwórz nowy terminal
  2. Znajdź działający identyfikator kontenera docker ps
  3. Zabij pojemnik docker kill ${containerId}
Wiaczesław Cotruta
źródło
0

aby zatrzymać proces dokera i zwolnić porty, najpierw użyj ctrl- caby wyjść z kontenera, a następnie użyj dokera ps, aby znaleźć listę uruchomionych kontenerów. Następnie możesz użyć przystanku kontenera dokującego, aby zatrzymać ten proces i zwolnić jego porty. Nazwę kontenera można znaleźć w poleceniu dokera ps, które podaje nazwę w kolumnie nazwy. Mam nadzieję, że to rozwiąże twoje pytania ....

Shankar
źródło
0

Jeśli potrzebujesz tylko procesu dokowania, aby przejść w tle, możesz go użyć

Ctrl + Z

Należy pamiętać, że nie jest to prawdziwe oderwanie i wiąże się z karą wydajności. (Możesz przywrócić go na pierwszy plan za pomocąbg polecenia).

Inną opcją jest zamknięcie terminalu, jeśli nie jest już potrzebny.

Tomek
źródło
0

Dla każdego, kto napotkał ten sam problem, co ja (nie mogę odłączyć bez zabicia kontenera, nawet po ustawieniu klucza odłączania) ......

Podczas uruchamiania pojemników z docker-compose up -d

zamiast używać docker attach {container name}do przeglądania dziennika tailing ....

try docker-compose logs -f {service name} ctrl- czabija ogon z bali bez zabijania twojego kontenera

{service name}jest usługą wymienioną w boku pliku docker-compose.yml .. (np. while nazwa kontenera = elk_logstash_1 -> nazwa usługi = logstash

HTH

Lon Kaut
źródło
0

Aktualizacja

Zazwyczaj korzystałem z narzędzia docker attach, aby zobaczyć, co wyświetla STDOUT, do rozwiązywania problemów z kontenerami. Właśnie znalazłemdocker logs --follow 621a4334f97b , co pozwala mi zobaczyć STDOUT, a jednocześnie ctrl + c wyłączyć z niego bez wpływu na działanie kontenera! Dokładnie to, czego zawsze chciałem.

... naturalnie będziesz musiał zastąpić swój własny identyfikator kontenera.

Oryginalna odpowiedź

Chciałem zostawić kontener uruchomiony, ale przyłączyłem go bez uruchamiania kontenera -it. Moim rozwiązaniem było poświęcenie zamiast tego mojego połączenia SSH (ponieważ byłem SSHed w maszynie, która uruchomiła kontenery). Zabicie tej sesji ssh pozostawiło pojemnik nietknięty, ale oderwało mnie od niego.

CenterOrbit
źródło