Bagaimana Anda melampirkan dan melepaskan diri dari proses Docker?

459

Saya dapat melampirkan ke proses buruh pelabuhan tetapi Ctrl+ ctidak bekerja untuk melepaskannya. exitpada dasarnya menghentikan proses.

Apa alur kerja yang disarankan agar proses berjalan, sesekali melampirkannya untuk membuat beberapa perubahan, lalu melepaskannya?

MarkL
sumber
4
Saat menggunakan nsenter, saya hanya Ctrl-D keluar.
user2105103
Apakah penutupan xterm, konsole, dll kerja? Ini bekerja untuk saya (saya terpisah).
Vytenis Bivainis

Jawaban:

668

Untuk melepaskan tty tanpa keluar dari shell, gunakan urutan escape Ctrl+ Pdiikuti oleh Ctrl+ Q. Lebih detail di sini .

Info tambahan dari sumber ini :

  • docker run -t -i → dapat dilepaskan dengan ^P^Qdan disambungkan kembali dengan docker attach
  • docker run -i → tidak dapat dilepaskan dengan ^P^Q; akan mengganggu stdin
  • run docker → tidak dapat dilepaskan dengan ^P^Q; dapat SIGKILL klien; dapat memasang kembali dengan melampirkan docker
Ken Cochrane
sumber
46
Ini akan menjadi jawaban yang bagus jika itu benar-benar berfungsi seperti yang dijelaskan dalam dokumen.
allingeek
20
Saya menemukan bahwa bahkan ketika berjalan dengan -it, urutan lepas gagal jika Anda juga memulai wadah dengan bendera pembersihan (--rm). Ini mungkin jelas bagi sebagian orang, tetapi itu menggigit saya lebih sering daripada yang ingin saya akui.
allingeek
7
Pilihan lain adalah cukup tutup jendela terminal atau cmd-w :)
buildmaestro
3
Anda dapat mengatur kunci "detachKeys": "ctrl-a,a"lepas yang dapat dikonfigurasi dengan mis. Dalam file .docker / config.json Anda atau --detach-keys "ctrl-a,a"pada baris perintah dengan melampirkan dll.
Matthew Hannigan
4
Ctrl + Ztidak lepas; itu hanya latar belakang prosesnya. Ini tidak sama dengan melepaskan dan membawa penalti kinerja.
Zenexer
178

Periksa juga yang --sig-proxypilihan :

docker attach --sig-proxy=false 304f5db405ec

Kemudian gunakan CTRL+ cuntuk melepaskan

Czerasz
sumber
4
Untuk mencoba memulai ini dengan menjalankan alih-alih melampirkan, saya mencoba: docker run -ti --sig-proxy=false busybox top yang sepertinya tidak berhasil, prosesnya dimatikan dengan ctrl-c tetapi mulai dengan docker run -t -sig-proxy=false busybox top tampaknya berfungsi dan memungkinkan berhenti dengan ctrl-c
Henning
Ctrl-cakan menghentikan wadah juga.
Evan Hu
Ini adalah satu-satunya solusi dari yang tercantum di sini yang berfungsi untuk saya di server Debian 9 yang menjalankan Docker 19.03.5. Pertanyaannya adalah, mengapa ini bukan pengaturan default untuk perintah attach? Tampaknya menjadi kasus penggunaan paling umum.
fviktor
Urutan Ctrl-p, Ctrl-q tidak berfungsi untuk saya (dimulai sebagai buruh pelabuhan menempelkan xyz) .. tapi ini tidak. Terima kasih @czerasz
PravyNandas
92

Jika Anda hanya ingin membuat beberapa modifikasi pada file atau memeriksa proses, berikut ini satu solusi lain yang mungkin Anda inginkan.

Anda bisa menjalankan perintah berikut untuk menjalankan proses baru dari wadah yang ada:

sudo docker exec -ti [CONTAINER-ID] bash

akan memulai proses baru dengan bash shell, dan Anda bisa keluar darinya dengan Ctrl+ Csecara langsung, itu tidak akan memengaruhi proses aslinya.

Colin Su
sumber
6
Ini berhasil, Anda dapat mengetik "keluar" setelah selesai tanpa memengaruhi proses aslinya.
Eko3alpha
Ini adalah cara yang bagus untuk menempel pada wadah berjalan. Tetapi bagaimana jika (katakanlah) saya memiliki beberapa proses yang berjalan dalam wadah dan saya ingin memulai kembali proses itu? Ah, saya bisa mematikan proses yang lama, memulai kembali yang baru, dan menggunakan Cp, Cq, yang berfungsi karena ini adalah tty interaktif. Saya suka --sig-proxy = metode salah juga, tapi ini lebih fleksibel dan tidak memaksa gangguan proses saat ini.
taranaki
"attach" memiliki arti khusus dengan Docker, dan execbukan itu.
frnhr
48

Saya pikir ini harus tergantung pada situasinya. Ambil wadah berikut sebagai contoh:

# 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) Gunakan " docker attach" untuk melampirkan wadah:

Karena " docker attach" tidak akan mengalokasikan tty baru, tetapi menggunakan kembali tty yang berjalan asli, jadi jika Anda menjalankan exitperintah, itu akan menyebabkan wadah yang berjalan keluar:

# 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

Jadi, kecuali Anda benar-benar ingin membuat keluar wadah berjalan, Anda harus menggunakan Ctrl+ p+ Ctrl+ q.

(2) Gunakan " docker exec"

Karena " docker exec" akan mengalokasikan tty baru, jadi saya pikir Anda harus menggunakan exitdaripada Ctrl+ p+ Ctrl+ q.

Berikut ini adalah mengeksekusi Ctrl+ p+ Ctrl+ quntuk keluar dari wadah:

# 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

Kemudian masuk kembali wadah, Anda akan melihat bashproses dalam docker execperintah preavious masih hidup (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
Nan Xiao
sumber
39

Untuk melepaskan diri dari wadah yang sedang berjalan, gunakan ^P^Q(tahan Ctrl, tekan P, tekan Q, lepaskan Ctrl).

Ada tangkapan: ini hanya berfungsi jika wadah dimulai dengan keduanya -t dan -i.

Jika Anda memiliki wadah berjalan yang dimulai tanpa satu (atau keduanya) opsi ini, dan Anda lampirkan docker attach, Anda harus menemukan cara lain untuk melepaskan. Bergantung pada opsi yang Anda pilih dan program yang berjalan, ^Cdapat bekerja, atau mungkin membunuh seluruh wadah. Anda harus bereksperimen.

Tangkapan lain: Bergantung pada program yang Anda gunakan, terminal, shell, SSH client, atau multiplexer Anda bisa menyadap salah satu ^Patau ^Q(biasanya yang terakhir). Untuk menguji apakah ini masalahnya, coba jalankan atau lampirkan dengan --detach-keys zargumen. Anda sekarang dapat melepaskan dengan menekan z, tanpa pengubah. Jika ini berhasil, program lain mengganggu. Cara termudah untuk mengatasi ini adalah dengan mengatur urutan lepas Anda sendiri menggunakan --detach-keysargumen. (Misalnya, untuk keluar dengan ^K, gunakan --detach-keys 'ctrl-k'.) Atau, Anda dapat mencoba menonaktifkan intersepsi tombol di terminal Anda atau program mengganggu lainnya. Misalnya, stty start ''atau stty start undefdapat mencegah terminal menyadap^Q pada beberapa sistem POSIX, walaupun saya belum menemukan ini membantu.

Zenexer
sumber
2
Penjelasan super tepat, bekerja seperti pesona
Meir Gabay
27

ketika tidak ada lagi yang berfungsi, buka terminal baru kemudian:

$ 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
sumber
Jebakan! Terima kasih, ini satu-satunya yang berhasil. -9tidak perlu.
Heath Raftery
Ini juga membunuh wadah - mungkin tergantung bendera mana yang ditetapkan.
AdamAL
1
Harap dicatat jika ada dua pids yang ditampilkan maka yang pertama adalah induknya. Anda harus menggunakan pid kedua untuk membunuh docker attachdan bukan orang tuanya.
joeytwiddle
11

Untuk melepaskan diri dari wadah, Anda cukup memegang Ctrldan menekan P+ Q.

Untuk melampirkan wadah yang sedang Anda gunakan:

$ docker container attach "container_name"
gXg
sumber
9

Saya memiliki masalah yang sama, ctrl- Pdan Qtidak akan bekerja, atau ctrl- C... akhirnya saya membuka sesi terminal lain dan saya melakukan "buruh pelabuhan berhenti containerid " dan "buruh pelabuhan mulai containerid " dan itu menyelesaikan pekerjaan. Aneh.

Pierluigi Vernetto
sumber
Ini tidak akan berhasil jika Anda memulai wadah dengan --rmbendera. Ctrl+Pdan Ctrl+Qberfungsi jika Anda memulai wadah dengan -itbendera.
Aswath K
4

Di shell yang sama, tahan ctrltombol dan tekan tombol plaluq

ravthiru
sumber
3
Ini hanya berfungsi jika Anda memulai wadah dengan -itbendera.
Aswath K
2

Saya menggunakan Mac, dan untuk beberapa alasan, Ctrl- p Ctrl- qhanya akan bekerja jika saya juga memegangShift

Jared Williams
sumber
1
  1. Buka terminal baru
  2. Temukan Id wadah yang berjalan docker ps
  3. Bunuh kontainernya docker kill ${containerId}
Vyacheslav Cotruta
sumber
0

untuk menghentikan proses buruh pelabuhan dan melepaskan porta, gunakan pertama ctrl- cuntuk meninggalkan pintu keluar kontainer kemudian gunakan buruh pelabuhan ps untuk menemukan daftar wadah berjalan. Kemudian Anda dapat menggunakan berhenti buruh pelabuhan untuk menghentikan proses itu dan melepaskan port-nya. Nama kontainer dapat Anda temukan dari perintah buruh pelabuhan ps yang memberikan nama di kolom nama. Semoga ini menyelesaikan pertanyaan Anda ....

shankar
sumber
0

Jika Anda hanya membutuhkan proses buruh pelabuhan di latar belakang yang dapat Anda gunakan

Ctrl + Z

Sadarilah bahwa itu bukan pelepasan nyata dan itu datang dengan penalti kinerja. (Anda dapat mengembalikannya ke latar depan dengan bgperintah).

Pilihan lain adalah menutup saja terminal Anda, jika Anda tidak membutuhkannya lagi.

Tom
sumber
0

Bagi siapa pun yang mengalami masalah yang sama saya lakukan (tidak dapat melepaskan tanpa membunuh wadah, bahkan ketika mengatur kunci lepas) ......

Saat memulai wadah Anda dengan docker-compose up -d

alih-alih menggunakan docker attach {container name}untuk melihat log tailing ....

coba docker-compose logs -f {service name} ctrl- cbunuh ekor log tanpa membunuh kontainer Anda

{service name}menjadi layanan yang tercantum di samping file docker-compose.yml Anda .. (mis. sementara nama wadah = elk_logstash_1 -> nama layanan = logstash

HTH

Lon Kaut
sumber
0

Memperbarui

Saya biasanya menggunakan buruh pelabuhan untuk melihat apa yang ditampilkan oleh STDOUT, untuk mengatasi masalah kontainer. Saya baru saja menemukan docker logs --follow 621a4334f97b, yang memungkinkan saya melihat STDOUT sementara juga bisa ctrl + c dari itu tanpa mempengaruhi operasi kontainer! Apa yang selalu saya inginkan.

... tentu saja Anda harus mengganti ID wadah Anda sendiri.

Jawaban Asli

Saya ingin membiarkan wadah berjalan, tetapi telah terpasang tanpa memulai wadah -it. Solusi saya adalah mengorbankan koneksi SSH saya sebagai gantinya (karena saya SSH masuk ke mesin yang menjalankan wadah). Membunuh sesi ssh itu membuat wadah tetap utuh tetapi melepaskanku darinya.

CenterOrbit
sumber