Làm thế nào để bạn đính kèm và tách ra khỏi quy trình của Docker?


458

Tôi có thể đính kèm vào một quy trình docker nhưng Ctrl+ ckhông hoạt động để tách khỏi nó. exitvề cơ bản tạm dừng quá trình.

Quy trình công việc được đề xuất để có quy trình đang chạy, thỉnh thoảng gắn vào nó để thực hiện một số thay đổi và sau đó tách ra?


4
Khi sử dụng nsenter, tôi chỉ cần Ctrl-D.
dùng2105103

Liệu bế mạc xterm, konsolevv làm việc? Nó hoạt động cho tôi (tôi được tách ra).
Vytenis Bivainis

Câu trả lời:


667

Để tách tty mà không thoát khỏi shell, sử dụng chuỗi thoát Ctrl+ Ptheo sau là Ctrl+ Q. Thêm chi tiết tại đây .

Thông tin bổ sung từ nguồn này :

  • Docker chạy -t -i → có thể được tách ra ^P^Qvà gắn lại với docker đính kèm
  • docker run -i → không thể tách rời với ^P^Q; sẽ phá vỡ stdin
  • docker chạy → không thể tách rời với ^P^Q; SIGKILL có thể khách hàng; có thể gắn lại với docker đính kèm

46
Đây sẽ là một câu trả lời tuyệt vời nếu nó thực sự hoạt động như được mô tả trong các tài liệu.
allingeek

20
Tôi thấy rằng ngay cả khi chạy với -it, trình tự tách không thành công nếu bạn cũng khởi động bộ chứa với cờ dọn dẹp (--rm). Điều này có thể rõ ràng với một số người, nhưng nó cắn tôi thường xuyên hơn tôi muốn thừa nhận.
allingeek

7
Một tùy chọn khác là chỉ cần đóng cửa sổ terminal hoặc cmd-w :)
buildmaestro

3
Bạn có thể đặt các khóa tách có thể định cấu hình với ví dụ: "detachKeys": "ctrl-a,a"trong tệp .docker / config.json hoặc --detach-keys "ctrl-a,a"trên dòng lệnh có đính kèm, v.v.
Matthew Hannigan

4
Ctrl + Zkhông tách ra; nó chỉ là nền tảng của quá trình. Nó không giống như tách ra và mang một hình phạt hiệu suất.
Zenexer

178

Kiểm tra cũng các --sig-proxytùy chọn :

docker attach --sig-proxy=false 304f5db405ec

Sau đó sử dụng CTRL+ cđể tách ra


4
Để thử điều này bắt đầu bằng chạy thay vì đính kèm, tôi đã thử: docker run -ti --sig-proxy=false busybox top dường như không hoạt động, quá trình này bị hủy bằng ctrl-c nhưng bắt đầu bằng docker run -t -sig-proxy=false busybox top dường như hoạt động và cho phép thoát bằng ctrl-c
Henning

Ctrl-ccũng sẽ dừng container.
Evan Hu

Đây là giải pháp duy nhất từ ​​những giải pháp được liệt kê ở đây, hoạt động với tôi trên máy chủ Debian 9 chạy Docker 19.03.5. Câu hỏi là, tại sao đây không phải là cài đặt mặc định cho các lệnh đính kèm? Nó dường như là trường hợp sử dụng phổ biến nhất.
fviktor

Trình tự Ctrl-p, Ctrl-q không hoạt động đối với tôi (bắt đầu dưới dạng docker container đính kèm xyz) .. nhưng điều này không xảy ra. Cảm ơn @czerasz
PravyNandas

92

Nếu bạn chỉ muốn thực hiện một số sửa đổi cho các tệp hoặc kiểm tra các quy trình, thì đây là một giải pháp khác mà bạn có thể muốn.

Bạn có thể chạy lệnh sau để thực thi quy trình mới từ vùng chứa hiện có:

sudo docker exec -ti [CONTAINER-ID] bash

sẽ bắt đầu một quy trình mới với bash shell và bạn có thể thoát khỏi nó bằng cách trực tiếp Ctrl+ C, nó sẽ không ảnh hưởng đến quy trình ban đầu.


6
Điều này đã làm việc, bạn có thể nhập "thoát" sau khi hoàn thành mà không ảnh hưởng đến quá trình ban đầu.
Eko3alpha

Đây là một cách tuyệt vời để gắn vào một container đang chạy. Nhưng nếu (nói) tôi có một số quy trình đang chạy trong container và tôi muốn khởi động lại quá trình đó thì sao? À, tôi chỉ có thể giết tiến trình cũ, khởi động lại tiến trình mới và sử dụng Cp, Cq, hoạt động vì nó là một tty tương tác. Tôi cũng thích phương thức --sig-proxy = false, nhưng phương thức này linh hoạt hơn và không làm gián đoạn quá trình hiện tại.
taranaki

"Đính kèm" có ý nghĩa cụ thể với Docker, và execkhông phải vậy.
frnhr

48

Tôi nghĩ rằng điều này sẽ phụ thuộc vào tình huống. Lấy ví dụ về container sau đây:

# 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) Sử dụng " docker attach" để đính kèm container:

Vì " docker attach" sẽ không phân bổ một tty mới, nhưng sử dụng lại tty đang chạy ban đầu, vì vậy nếu bạn chạy exitlệnh, nó sẽ gây ra thoát container đang chạy:

# 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

Vì vậy, trừ khi bạn thực sự muốn thực hiện chạy thoát container, bạn nên sử dụng Ctrl+ p+ Ctrl+ q.

(2) Sử dụng " docker exec"

Vì " docker exec" sẽ phân bổ một tty mới, vì vậy tôi nghĩ bạn nên sử dụng exitthay vì Ctrl+ p+ Ctrl+ q.

Sau đây là thực thi Ctrl+ p+ Ctrl+ qđể thoát khỏi container:

# 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

Sau đó đăng nhập lại container, bạn sẽ thấy bashquá trình trong docker execlệnh preaingly vẫn còn tồn tại (PID là 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

39

Để tách khỏi một container đang chạy, sử dụng ^P^Q(giữ Ctrl, nhấn P, nhấn Q, thả Ctrl).

Có một nhược điểm: điều này chỉ hoạt động nếu container được bắt đầu bằng cả hai -t-i.

Nếu bạn có một container đang chạy đã được khởi động mà không có một (hoặc cả hai) tùy chọn này và bạn đính kèm docker attach, bạn sẽ cần tìm một cách khác để tách ra. Tùy thuộc vào các tùy chọn bạn đã chọn và chương trình đang chạy, ^Ccó thể hoạt động hoặc có thể giết chết toàn bộ container. Bạn sẽ phải thử nghiệm.

Một lưu ý khác: Tùy thuộc vào các chương trình bạn đang sử dụng, thiết bị đầu cuối, trình bao, máy khách SSH hoặc bộ ghép kênh của bạn có thể bị chặn ^Phoặc ^Q(thường là chương trình sau). Để kiểm tra xem đây có phải là sự cố hay không, hãy thử chạy hoặc đính kèm với --detach-keys zđối số. Bây giờ bạn có thể tách ra bằng cách nhấn z, mà không cần bất kỳ sửa đổi. Nếu điều này hoạt động, một chương trình khác đang can thiệp. Cách dễ nhất để giải quyết vấn đề này là thiết lập trình tự tách riêng của bạn bằng cách sử dụng --detach-keysđối số. (Ví dụ: để thoát với ^K, sử dụng --detach-keys 'ctrl-k'.) Ngoài ra, bạn có thể cố gắng vô hiệu hóa việc chặn các phím trong thiết bị đầu cuối hoặc chương trình can thiệp khác. Ví dụ, stty start ''hoặc stty start undefcó thể ngăn thiết bị đầu cuối chặn^Q trên một số hệ thống POSIX, mặc dù tôi không thấy điều này hữu ích.


2
Giải thích siêu chính xác, hoạt động như một bùa mê
Meir Gabay

27

Khi không có gì khác hoạt động, hãy mở một thiết bị đầu cuối mới :

$ 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>

Thật là một cái bẫy! Cảm ơn bạn, đây là điều duy nhất đã làm việc. -9không cần thiết
Heath Raftery

Điều này cũng giết chết container - có lẽ phụ thuộc vào cờ nào được đặt.
AdamAL

1
Xin lưu ý nếu có hai pids được hiển thị thì cái đầu tiên là cha mẹ. Bạn nên sử dụng pid thứ hai để giết docker attachvà không phải cha mẹ của nó.
joeytwiddle

11

Để tách khỏi container, bạn chỉ cần giữ Ctrlvà nhấn P+ Q.

Để gắn vào một container đang chạy, bạn sử dụng:

$ docker container attach "container_name"

9

Tôi có cùng một vấn đề, ctrl- PQsẽ không hoạt động, cũng không ctrl- C... cuối cùng tôi đã mở một phiên cuối khác và tôi đã "docker stop containerid " và "docker start containerid " và nó đã hoàn thành công việc. Kỳ dị.


Điều này sẽ không hoạt động nếu bạn bắt đầu container với --rmcờ. Ctrl+PCtrl+Qhoạt động nếu bạn bắt đầu container với -itcờ.
Aswath K

4

Trong cùng một vỏ, giữ ctrlphím và nhấn phím psau đóq


3
Điều này chỉ hoạt động nếu bạn bắt đầu container với -itcờ.
Aswath K

2

Tôi đang dùng Mac và vì một số lý do, Ctrl- p Ctrl- qsẽ chỉ hoạt động nếu tôi cũng tổ chứcShift


1
  1. Mở một thiết bị đầu cuối mới
  2. Tìm Id container đang chạy docker ps
  3. Giết container docker kill ${containerId}

0

để dừng quá trình docker và giải phóng các cổng, trước tiên hãy sử dụng ctrl- cđể thoát khỏi container sau đó sử dụng docker ps để tìm danh sách các container đang chạy. Sau đó, bạn có thể sử dụng dừng container docker để dừng quá trình đó và giải phóng các cổng của nó. Tên container bạn có thể tìm thấy từ lệnh ps docker cung cấp tên trong cột tên. Hy vọng điều này sẽ giải quyết các truy vấn của bạn ....


0

Nếu bạn chỉ cần quá trình docker đi trong nền, bạn có thể sử dụng

Ctrl + Z

Hãy lưu ý rằng nó không phải là một tách rời thực sự và nó đi kèm với một hình phạt hiệu suất. (Bạn có thể đưa nó trở lại tiền cảnh với bglệnh).

Một lựa chọn khác là chỉ đóng thiết bị đầu cuối của bạn, nếu bạn không cần nó nữa.


0

Đối với bất kỳ ai gặp phải vấn đề tương tự tôi đã làm (không thể tách ra mà không làm chết container, ngay cả khi cài đặt khóa tách) ......

Khi bắt đầu container của bạn với docker-compose up -d

thay vì sử dụng docker attach {container name}để xem nhật ký đuôi ....

thử docker-compose logs -f {service name} ctrl- cgiết đuôi log mà không làm chết container của bạn

{service name}là dịch vụ được liệt kê bên cạnh tệp docker-compose.yml của bạn .. (ví dụ: trong khi tên container = elk_logstash_1 -> tên dịch vụ = logstash

HTH


0

Cập nhật

Tôi thường sử dụng docker đính kèm để xem những gì STDOUT đang hiển thị, để xử lý các thùng chứa. Tôi vừa tìm thấy docker logs --follow 621a4334f97b, cho phép tôi thấy STDOUT trong khi cũng có thể tắt ctrl + c mà không ảnh hưởng đến hoạt động của container! Chính xác những gì tôi luôn muốn.

... đương nhiên bạn sẽ cần thay thế trong ID container của riêng bạn.

Câu trả lời gốc

Tôi muốn để container chạy, nhưng đã gắn mà không khởi động container -it. Thay vào đó, giải pháp của tôi là hy sinh kết nối SSH của tôi (vì tôi đã được SSH vào máy đang chạy các container). Giết phiên ssh đó để nguyên container nhưng tách tôi ra khỏi nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.