คุณจะแนบและแยกออกจากกระบวนการของนักเทียบท่าได้อย่างไร


459

ฉันสามารถแนบกับกระบวนการนักเทียบท่า แต่Ctrl+ cไม่ทำงานเพื่อแยกออกจากมัน exitโดยทั่วไปจะหยุดกระบวนการ

เวิร์กโฟลว์ที่แนะนำคืออะไรที่จะให้กระบวนการทำงานในบางครั้งการเชื่อมต่อกับมันเพื่อทำการเปลี่ยนแปลงบางอย่างจากนั้นจึงแยกออก


4
เมื่อใช้ nsenter ฉันเพิ่งกด Ctrl-D
user2105103

ไม่ปิดxterm, konsoleฯลฯ ทำงานหรือไม่ มันใช้งานได้สำหรับฉัน (ฉันถูกถอดออก)
Vytenis Bivainis

คำตอบ:


668

การถอด TTY โดยไม่ต้องออกจากเปลือกใช้ลำดับหนีCtrl+ Pตามด้วย+Ctrl Qรายละเอียดเพิ่มเติมที่นี่

ข้อมูลเพิ่มเติมจากแหล่งนี้ :

  • นักเทียบท่าวิ่ง -t -i →สามารถถอดออกได้ด้วย^P^Qและแนบกับนักเทียบท่าแนบ
  • นักเทียบท่า run -i →ไม่สามารถถอดออกด้วย^P^Q; จะรบกวน stdin
  • นักวิ่ง→ไม่สามารถถอดออกด้วย^P^Q; ลูกค้า SIGKILL สามารถ; สามารถติดตั้งใหม่พร้อมแนบนักเทียบท่า

46
นี่จะเป็นคำตอบที่ดีถ้ามันใช้งานได้จริงตามที่อธิบายไว้ในเอกสาร
allingeek

20
ฉันพบว่าแม้เมื่อรันด้วย -it ลำดับ detach จะล้มเหลวหากคุณเริ่มต้นคอนเทนเนอร์ด้วยแฟล็ก cleanup (--rm) นี่อาจจะชัดเจนสำหรับบางคน แต่มันกัดฉันบ่อยกว่าที่ฉันต้องการยอมรับ
allingeek

7
อีกตัวเลือกหนึ่งคือเพียงแค่ปิดหน้าต่างเทอร์มินัลของคุณหรือ cmd-w :)
buildmaestro

3
คุณสามารถตั้งค่าปุ่มปลดที่กำหนดค่าได้เช่น"detachKeys": "ctrl-a,a"ในไฟล์. docer / config.json ของคุณหรือ --detach-keys "ctrl-a,a"ในบรรทัดคำสั่งพร้อมไฟล์แนบอื่น ๆ
Matthew Hannigan

4
Ctrl + Zไม่แยกออก มันเป็นเพียงกระบวนการพื้นหลัง มันไม่เหมือนกับการปลดและดำเนินการลงโทษ
Zenexer

178

ลองใช้--sig-proxyตัวเลือก :

docker attach --sig-proxy=false 304f5db405ec

จากนั้นใช้CTRL+ cเพื่อแยก


4
เมื่อต้องการลองเริ่มต้นด้วยการรันแทนการแนบฉันพยายาม: docker run -ti --sig-proxy=false busybox top ซึ่งดูเหมือนว่าจะไม่ทำงานกระบวนการถูกฆ่าด้วย ctrl-c แต่เริ่มต้นด้วย docker run -t -sig-proxy=false busybox top ดูเหมือนจะทำงานและเปิดใช้งานการเลิกใช้ ctrl-c
Henning

Ctrl-cจะหยุดภาชนะยัง
Evan Hu

มันเป็นทางออกเดียวจากที่ระบุไว้ที่นี่ซึ่งทำงานให้ฉันบนเซิร์ฟเวอร์ Debian 9 ที่ใช้ Docker 19.03.5 คำถามคือทำไมการตั้งค่าเริ่มต้นสำหรับคำสั่งแนบจึงไม่ได้ ดูเหมือนว่าจะเป็นกรณีการใช้งานที่พบบ่อยที่สุด
fviktor

ลำดับ Ctrl-p, Ctrl-q ใช้ไม่ได้สำหรับฉัน (เริ่มต้นเป็นตัวเชื่อมต่อคอนเทนเนอร์แนบ xyz) .. แต่มันทำเช่นนั้น ขอบคุณ @czerasz
PravyNandas

92

หากคุณต้องการแก้ไขไฟล์หรือตรวจสอบกระบวนการนี่เป็นอีกวิธีหนึ่งที่คุณอาจต้องการ

คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อดำเนินการกระบวนการใหม่จากภาชนะที่มีอยู่:

sudo docker exec -ti [CONTAINER-ID] bash

จะเริ่มต้นกระบวนการใหม่ด้วย bash shell และคุณสามารถหลีกเลี่ยงได้โดยCtrl+ Cโดยตรงมันจะไม่ส่งผลกระทบต่อกระบวนการดั้งเดิม


6
สิ่งนี้ทำงานได้คุณสามารถพิมพ์ "exit" เมื่อเสร็จสิ้นโดยไม่ส่งผลกระทบต่อกระบวนการดั้งเดิม
Eko3alpha

นี่เป็นวิธีที่ดีในการเชื่อมต่อกับคอนเทนเนอร์ที่ใช้งานอยู่ แต่ถ้าเป็นเช่นนั้นฉันมีกระบวนการบางอย่างที่ทำงานอยู่ในคอนเทนเนอร์และฉันต้องการรีสตาร์ทกระบวนการนั้น อ่าฉันสามารถฆ่ากระบวนการเก่าเริ่มใหม่และใช้ Cp, Cq ซึ่งทำงานได้เนื่องจากเป็น tty เชิงโต้ตอบ ฉันชอบ --sig-proxy = false method เช่นกัน แต่มันมีความหลากหลายมากกว่าและไม่บังคับให้มีการหยุดชะงักของกระบวนการปัจจุบัน
taranaki

"Attach" มีความหมายเฉพาะกับ Docker และexecไม่ใช่
frnhr

48

ฉันคิดว่าสิ่งนี้ควรขึ้นอยู่กับสถานการณ์ใช้คอนเทนเนอร์ต่อไปนี้เป็นตัวอย่าง:

# 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) ใช้ " docker attach" เพื่อแนบคอนเทนเนอร์:

เนื่องจาก " docker attach" จะไม่จัดสรร tty ใหม่ แต่ใช้ tty ที่ทำงานอยู่เดิมดังนั้นหากคุณเรียกใช้exitคำสั่งคำสั่งจะทำให้การออกจากคอนเทนเนอร์ที่ใช้อยู่:

# 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

ดังนั้นถ้าคุณอยากที่จะทำให้การทำงานออกจากภาชนะที่คุณควรใช้Ctrl+ p+ + Ctrlq

(2) ใช้ " docker exec"

ตั้งแต่ " docker exec" จะจัดสรร TTY ใหม่ดังนั้นฉันคิดว่าคุณควรจะใช้exitแทนCtrl+ p+ + Ctrlq

ต่อไปนี้คือการดำเนินการCtrl+ p+ Ctrl+ qเพื่อออกจากภาชนะ:

# 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

จากนั้นเข้าสู่ระบบคอนเทนเนอร์อีกครั้งคุณจะเห็นbashกระบวนการในdocker execคำสั่งpreavious ยังคงมีชีวิตอยู่ (PID คือ 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

เพื่อแยกออกจากภาชนะที่ใช้งานให้ใช้^P^Q( CtrlกดP, กดQ, กด, ปล่อยCtrl)

มีการจับเป็น:นี้จะทำงานเฉพาะในกรณีที่ภาชนะที่เริ่มต้นด้วยทั้งสอง และ-t-i

หากคุณมีคอนเทนเนอร์ที่ใช้งานซึ่งเริ่มทำงานโดยไม่มีตัวเลือกเหล่านี้ (หรือทั้งคู่) และคุณแนบไปด้วยdocker attachคุณจะต้องหาวิธีอื่นในการแยกออก ขึ้นอยู่กับตัวเลือกที่คุณเลือกและโปรแกรมที่กำลังทำงาน^Cอาจใช้งานได้หรืออาจฆ่าทั้งคอนเทนเนอร์ คุณจะต้องทดสอบ

Catch catch อื่น:ขึ้นอยู่กับโปรแกรมที่คุณใช้งานเทอร์มินัลเชลล์ไคลเอ็นต์ SSH หรือมัลติเพล็กเซอร์ของคุณอาจดักจับอย่างใดอย่างหนึ่ง^Pหรือ^Q(โดยปกติจะเป็นอันหลัง) หากต้องการทดสอบว่านี่เป็นปัญหาหรือไม่ให้ลองเรียกใช้หรือแนบ--detach-keys zอาร์กิวเมนต์ ตอนนี้คุณควรจะสามารถแยกออกได้โดยการกดzโดยไม่มีตัวดัดแปลงใด ๆ หากใช้งานได้แสดงว่ามีโปรแกรมอื่นรบกวน วิธีที่ง่ายที่สุดในการหลีกเลี่ยงปัญหานี้คือการตั้งค่าลำดับการแยกของคุณเองโดยใช้--detach-keysอาร์กิวเมนต์ (ตัวอย่างเช่นหากต้องการออกด้วย^Kใช้--detach-keys 'ctrl-k') หรือคุณสามารถลองปิดการใช้งานการสกัดกั้นของปุ่มต่าง ๆ ในเครื่องเทอร์มินัลหรือโปรแกรมที่รบกวนอื่น ๆ ตัวอย่างเช่นstty start ''หรือstty start undefอาจป้องกันไม่ให้เครื่องดักจับ^Q ในระบบ POSIX บางระบบถึงแม้ว่าฉันจะไม่พบว่าสิ่งนี้มีประโยชน์


2
คำอธิบายที่แม่นยำที่สุดทำงานได้อย่างมีเสน่ห์
Meir Gabay

27

เมื่อไม่มีอะไรทำงานให้เปิดเทอร์มินัลใหม่จากนั้น:

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

อะไรกับดัก! ขอบคุณนี่เป็นสิ่งเดียวที่ทำงานได้ -9ไม่จำเป็น
Heath Raftery

นี่จะฆ่าคอนเทนเนอร์ด้วย - ซึ่งอาจขึ้นอยู่กับว่าตั้งค่าสถานะไว้ที่ใด
AdamAL

1
โปรดทราบว่ามีสอง pidsแสดงแล้วคนแรกเป็นผู้ปกครอง คุณควรใช้ pid ตัวที่สองเพื่อฆ่าdocker attachไม่ใช่ตัวหลัก
joeytwiddle

11

ที่จะแยกออกจากภาชนะคุณก็ค้างCtrlและกด+PQ

ในการแนบกับคอนเทนเนอร์ที่ใช้งานคุณใช้:

$ docker container attach "container_name"

9

ฉันมีปัญหาเดียวกันctrl- PและQจะไม่ทำงานหรือctrl- C... ในที่สุดฉันก็เปิดเซสชันเทอร์มินัลอื่นและฉันได้ "นักเทียบท่าหยุดcontainerid " และ "นักเทียบท่าเริ่มcontainerid " และมันก็ทำงานเสร็จแล้ว แปลก.


สิ่งนี้จะไม่ทำงานหากคุณเริ่มคอนเทนเนอร์ด้วย--rmแฟล็ก Ctrl+Pและใช้Ctrl+Qงานได้หากคุณเริ่มต้นคอนเทนเนอร์ด้วย-itแฟล็ก
Aswath K

4

ในเชลล์เดียวกันctrlกดปุ่มค้างไว้แล้วกดปุ่มpจากนั้นq


3
ใช้งานได้ก็ต่อเมื่อคุณเริ่มต้นคอนเทนเนอร์ด้วย-itแฟล็ก
Aswath K


1
  1. เปิดเทอร์มินัลใหม่
  2. ค้นหา ID คอนเทนเนอร์ที่กำลังรัน docker ps
  3. ฆ่าภาชนะ docker kill ${containerId}

0

เพื่อหยุดกระบวนการตัวเทียบท่าและปล่อยพอร์ตให้ใช้ครั้งแรกctrl- cเพื่อออกจากภาชนะแล้วใช้ ps นักเทียบท่าเพื่อค้นหารายการของภาชนะที่ใช้งาน จากนั้นคุณสามารถใช้หยุดนักเทียบท่าเพื่อหยุดกระบวนการนั้นและปล่อยพอร์ตของมัน ชื่อคอนเทนเนอร์ที่คุณสามารถหาได้จากคำสั่ง docker ps ซึ่งให้ชื่อในคอลัมน์ชื่อ หวังว่านี่จะช่วยแก้ข้อสงสัยของคุณได้ ....


0

หากคุณต้องการให้นักเทียบท่าทำงานเป็นพื้นหลังคุณก็สามารถใช้งานได้

Ctrl + Z

โปรดระวังว่ามันไม่ใช่ตัวจริงและมาพร้อมกับการลงโทษ (คุณสามารถคืนค่ามันให้เบื้องหน้าด้วยbgคำสั่ง)

อีกตัวเลือกหนึ่งคือปิดเทอร์มินัลของคุณหากคุณไม่ต้องการอีกต่อไป


0

สำหรับทุกคนที่พบปัญหาเดียวกันกับที่ฉันทำ (ไม่สามารถแยกออกได้โดยไม่ฆ่าภาชนะแม้ว่าจะตั้งค่ากุญแจแยก) ......

เมื่อเริ่มภาชนะของคุณด้วย docker-compose up -d

แทนการใช้ docker attach {container name}เพื่อดูบันทึกการ tailing ...

ลองdocker-compose logs -f {service name} ctrl-cฆ่าหางบันทึกโดยไม่ฆ่าภาชนะของคุณ

{service name} เป็นบริการที่แสดงอยู่ข้างไฟล์ docker-compose.yml ของคุณ docker-compose.yml (เช่นในขณะที่ชื่อคอนเทนเนอร์ = elk_logstash_1 -> ชื่อบริการ = logstash

HTH


0

ปรับปรุง

ฉันมักจะใช้นักเทียบท่าแนบเพื่อดูสิ่งที่ STDOUT แสดงสำหรับการแก้ไขปัญหาภาชนะบรรจุ ฉันเพิ่งพบdocker logs --follow 621a4334f97bซึ่งให้ฉันดู STDOUT ในขณะที่ยังสามารถ ctrl + c จากมันโดยไม่ส่งผลกระทบต่อการทำงานของคอนเทนเนอร์! สิ่งที่ฉันต้องการเสมอ

... โดยปกติคุณจะต้องแทนที่ด้วย ID คอนเทนเนอร์ของคุณเอง

คำตอบเดิม

ฉันต้องการที่จะออกจากภาชนะที่ทำงาน -itแต่ติดอยู่โดยไม่ต้องเริ่มภาชนะที่มี ทางออกของฉันคือการเสียสละการเชื่อมต่อ SSH ของฉันแทน (ตั้งแต่ฉัน SSHed เข้าไปในเครื่องที่ใช้ภาชนะบรรจุ) การฆ่าเซสชันของ SSH นั้นทิ้งคอนเทนเนอร์ไว้เหมือนเดิม แต่ดึงฉันออกจากมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.