Cách chính xác để tách ra khỏi một container mà không dừng lại


313

Trong Docker 1.1.2 (mới nhất), cách chính xác để tách khỏi container mà không dừng lại là gì?

Vì vậy, ví dụ, nếu tôi thử:

  • docker run -i -t foo /bin/bash hoặc là
  • docker attach foo (đối với container đã chạy)

cả hai đều đưa tôi đến một thiết bị đầu cuối trong container, làm cách nào để thoát khỏi thiết bị đầu cuối của container mà không dừng lại?

exitCTR+Ccả hai dừng container.


"Container" chỉ là một tập hợp các không gian tên bị hạn chế (một không gian tên quy trình, một không gian tên hệ thống tập tin, v.v.) mà các tiến trình có thể chạy. Nếu bạn không có quá trình bên trong một không gian tên, thì không gian tên đó có thực sự tồn tại không? Nó không giống như một máy ảo trong đó có nhân trả lời ngắt đồng hồ & c. bất kể.
Charles Duffy

Câu trả lời:


166

Cập nhật: Như đã đề cập trong câu trả lời bên dưới Ctrl+ p, Ctrl+ qsẽ chuyển chế độ tương tác thành chế độ daemon.


Vâng Ctrl+ C(hoặc Ctrl+ \) sẽ tách bạn ra khỏi container nhưng nó sẽ giết chết container vì quy trình chính của bạn là một bash.

Một bài học nhỏ về docker. Container không phải là một hệ điều hành đầy đủ chức năng thực sự. Khi bạn chạy một container, quá trình bạn khởi chạy sẽ thực hiện PID 1 và giả sử nguồn init. Vì vậy, khi quá trình đó kết thúc, daemon dừng container cho đến khi một tiến trình mới được khởi chạy (thông qua khởi động docker) (Giải thích thêm về vấn đề http://phusion.github.io/baseimage-docker/#intro )

Nếu bạn muốn một container chạy ở chế độ tách rời mọi lúc, tôi khuyên bạn nên sử dụng

docker run -d foo

Với một máy chủ ssh trên container. (cách dễ nhất là làm theo hướng dẫn mở cửa dockerizing https://docs.docker.com/engine/examples/rasty_ssh_service/ )

Hoặc bạn chỉ có thể khởi chạy lại container của bạn thông qua

docker start foo

(nó sẽ được tách ra theo mặc định)


3
+1 cho docker cơ sở. Thật tuyệt khi biết có một mẫu với lời khuyên về các phần cứng của Docker.
mtmacdonald

Lưu ý rằng ssh không thực sự cần thiết: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat

1
chạy một chế độ trong -d chứa rất hữu ích. Ngoài ra, liên kết để bắt đầu ssh thông qua Dockerfile làm cho cuộc sống của tôi dễ dàng.
Ravi

56
Tách bằng Ctrl-p, Ctrl-q. Lời khuyên này sẽ giết chết một container.
taranaki

4
Điều này làm việc cho tôi (lấy từ câu trả lời bên dưới): Bắt đầu với -ti -d, sau đó đính kèm docker attach, sau đó tách ra với ctrl + p đầu tiên và sau đó ctrl + q. Tôi nghĩ, tôi có thể sử dụng chỉ một trong những phím tắt.
CGFoX

526

Ctrl+ prồi Ctrl+ q. Nó sẽ giúp bạn chuyển chế độ tương tác sang chế độ daemon.

Xem https://docs.docker.com/v1.7/articles/basics/#rasty-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
Nó dường như không hoạt động với (cố gắng thoát khỏi một thùng chứa Wekan đính kèm).
nguy hiểm89

7
Tôi đã truy cập trang này rất nhiều lần vì tôi không thể nhớ chính xác tổ hợp phím này! :-D
Thamme Gowda

10
@ risk89 ctrl-p, ctrl-q sẽ chỉ hoạt động khi bạn đã khởi động container của mình với chế độ tương tác (-it). Nếu bạn đã khởi động nó ở chế độ deamon (-d) và được gắn vào nó, bạn có thể thoát nó và nó vẫn sẽ chạy trong nền.
Riscie

1
@SlimShady nhấn Ctrl + P sau đó, Ctrl + Q để thoát, không phải một trong số họ, nhưng, cả hai theo thứ tự đó.
Mohyaddin Alaoddin

160

Tôi đi sâu vào vấn đề này và tất cả các câu trả lời ở trên là một phần đúng. Tất cả phụ thuộc vào cách thức ra mắt container. Nó đi xuống như sau khi container được đưa ra:

  • là một TTY được phân bổ ( -t)
  • đã bị bỏ ngỏ ( -i)

^P^Q không hoạt động, NHƯNG chỉ khi -t-iđược sử dụng để khởi chạy container:

[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 không hoạt động, NHƯNG chỉ khi -t( không có -i ) được sử dụng để khởi chạy container:

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

Cách thứ ba để tách ra

Có một cách để tách mà không làm chết container; bạn cần một cái vỏ khác Tóm lại, chạy cái này trong một shell khác tách ra và để container chạy 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]$

Tại sao? Bởi vì bạn đang giết quá trình kết nối bạn với container chứ không phải chính container.


2
cách thứ ba làm việc cho tôi. Cảm ơn. nếu bạn đang gắn vào một số trường hợp và chỉ muốn tách ra khỏi một trường hợp. Có thể giết quá trình cụ thể: ps -ef | grep đính kèm -> nhận pid. Sau đó: giết -9 <pid>
bây giờ

pkill là thứ duy nhất hoạt động với tôi sau khi gắn
docker

Tại sao chúng ta cần -9. Tôi nhận thấy nếu chúng ta không sử dụng -9 thì nó sẽ tắt container.
Angelo

Các tín hiệu khác là, tín hiệu. Họ nói cho quá trình loại tín hiệu nào và cho nó cơ hội hành động và làm một cái gì đó. Các kill -9tín hiệu không. Quá trình được chấm dứt và không có sự truy đòi. Tôi đoán là các tín hiệu khác cung cấp cho container một cơ hội để tắt, trong khi -9không.
Berto

1
Điều này là siêu hữu ích. Cảm ơn!
Evan Zamir

40

Nếu bạn thực hiện "docker đính kèm" id container ", bạn vào trong container. Để thoát khỏi container mà không dừng container, bạn cần nhập Ctrl+ P+Q


6
tốt hơn để Ctrl + P và Ctrl + Q
sib10

4
Ctrl + P, Q (vẫn giữ Ctrl);)
dimpiax

nó trả lại cho tôi:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webdess

31

Tôi coi câu trả lời của Ashwin là đúng nhất, câu trả lời cũ của tôi ở bên dưới.


Tôi muốn thêm một tùy chọn khác ở đây là chạy container như sau

docker run -dti foo bash

Sau đó, bạn có thể nhập container và chạy bash với

docker exec -ti ID_of_foo bash

Không cần cài đặt sshd :)


Tôi nghĩ rằng trong lệnh thứ hai, bạn cần thay thế foo bằng id container của foo
Nehal J Wani

Trong bối cảnh này, tôi nghĩ docker attachsẽ chuẩn hơn, bằng cách gắn lại cho lần chạy bash đầu tiên. docker execcũng hoạt động ở đây, tuy nhiên nó tạo ra một quy trình bash mới ngoài quy trình đầu tiên. Chắc chắn, quá trình này được tạo trong cùng một bối cảnh / môi trường / vùng chứa của cái đầu tiên, tuy nhiên nó là một cái khác (tương tự sẽ là mở một tab thiết bị đầu cuối mới trong trình giả lập thiết bị đầu cuối yêu thích của bạn).
thiagowfx

20

Cách mặc định để tách khỏi vùng chứa tương tác là Ctrl+ P Ctrl+ Q, nhưng bạn có thể ghi đè lên nó khi chạy một vùng chứa mới hoặc gắn vào vùng chứa hiện có bằng cách sử dụng cờ --detach-key .


16

Nếu bạn gắn qua docker attach, bạn có thể tách ra bằng cách giết quá trình đính kèm docker. Cách tốt hơn là sử dụng tham số sig-proxy để tránh truyền Ctrl + C vào vùng chứa của bạn:

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

Tùy chọn tương tự có sẵn cho docker runlệnh.


6
Mặc dù --sig-proxy = false cực kỳ hữu ích, nhưng nó không hoạt động đối với các thùng chứa đã được đính kèm mà nó không được chỉ định. Vấn đề là, sau khi gắn vào, dường như KHÔNG có cách nào để tách ra mà không làm chết quá trình, bao gồm cả "giết quá trình đính kèm docker". Cp, Cq không hoạt động với các thùng chứa đính kèm, chỉ những cái tương tác (như câu hỏi sử dụng).
taranaki

1
Đây phải là câu trả lời được chấp nhận, bao gồm nhận xét của @taranaki, Ctrl + P, Q không hoạt động chophp:7.3-apache
MKaama

10

Nếu bạn chỉ muốn xem đầu ra của quá trình đang chạy từ bên trong container, bạn có thể thực hiện một cách đơn giản docker container logs -f <container id>.

Các -flá cờ làm cho nó để đầu ra của container được followedvà cập nhật trong thời gian thực. Rất hữu ích để gỡ lỗi hoặc giám sát.


8

Bạn có thể sử dụng --detach-keystùy chọn khi bạn chạy docker attachđể ghi đè mặc định CTRL+ P, CTRL+ Qchụp liên tục (mà không làm luôn công việc).

Ví dụ, khi bạn chạy docker attach --detach-keys="ctrl-a" testvà nhấn CTRL+ Abạn sẽ thoát khỏi container, mà không giết nó.

Những ví dụ khác:

  • docker attach --detach-keys="ctrl-a,x" test- nhấn CTRL+Avà sau đó Xđể thoát
  • docker attach --detach-keys="a,b,c" test- nhấn A, sau đó B, Cđể thoát

Trích từ tài liệu chính thức:

Nếu bạn muốn, bạn có thể định cấu hình ghi đè chuỗi khóa Docker để tách. Điều này hữu ích nếu trình tự mặc định Docker xung đột với trình tự khóa bạn sử dụng cho các ứng dụng khác. Có hai cách để xác định chuỗi khóa tách riêng của bạn, như ghi đè trên mỗi vùng chứa hoặc là thuộc tính cấu hình trên toàn bộ cấu hình của bạn.

Để ghi đè chuỗi cho một container riêng lẻ, hãy sử dụng --detach-keys="<sequence>"cờ với lệnh đính kèm docker. Định dạng của <sequence>một chữ cái [a-Z]hoặc là ctrl-kết hợp với bất kỳ thứ nào sau đây:

  • az (một ký tự chữ thường alpha)
  • @ (lúc ký)
  • [(khung bên trái)
  • \ (hai dấu gạch chéo ngược)
  • _ (gạch dưới)
  • ^ (quan tâm)

Những a, ctrl-a, X, hoặc ctrl-\\giá trị này là tất cả các ví dụ về chuỗi chìa khóa hợp lệ. Để định cấu hình chuỗi khóa mặc định cấu hình khác cho tất cả các vùng chứa, hãy xem phần Tệp cấu hình .

Lưu ý: Điều này hoạt động kể từ phiên bản docker 1.10+ (tại thời điểm trả lời này, phiên bản hiện tại là 18.03)


0

Bài cũ nhưng chỉ cần thoát rồi khởi động lại ... vấn đề là nếu bạn đang ở trên máy windows Ctrl p hoặc Ctrl P bị trói để in ... thoát khỏi việc bắt đầu container thì không làm tổn thương gì cả

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.