Cara yang benar untuk melepaskan dari wadah tanpa menghentikannya

313

Di Docker 1.1.2 (terbaru), apa cara yang benar untuk melepaskan dari wadah tanpa menghentikannya?

Jadi misalnya, jika saya mencoba:

  • docker run -i -t foo /bin/bash atau
  • docker attach foo (untuk wadah yang sudah berjalan)

keduanya membawa saya ke terminal dalam wadah, bagaimana cara keluar dari terminal wadah tanpa menghentikannya?

exitdan CTR+Ckeduanya menghentikan wadah.

mtmacdonald
sumber
"Wadah" hanyalah seperangkat ruang nama terbatas (proses namespace, namespace sistem file, dll.) Yang dapat dijalankan oleh proses. Jika Anda tidak memiliki proses di dalam namespace, apakah namespace itu benar-benar ada? Ini tidak seperti mesin virtual di mana ada jam penjawab kernel terganggu & c. bagaimanapun juga.
Charles Duffy

Jawaban:

166

Pembaruan: Seperti yang disebutkan di bawah jawaban Ctrl+ p, Ctrl+ qsekarang akan mengubah mode interaktif menjadi mode daemon.


Nah Ctrl+ C(atau Ctrl+ \) harus melepaskan Anda dari wadah tetapi itu akan membunuh wadah karena proses utama Anda adalah bash.

Sedikit pelajaran tentang buruh pelabuhan. Wadah bukan OS fungsional penuh nyata. Saat Anda menjalankan sebuah wadah, proses yang Anda luncurkan mengambil PID 1 dan mengasumsikan daya init. Jadi, ketika proses itu dihentikan daemon menghentikan wadah sampai proses baru diluncurkan (melalui buruh pelabuhan mulai) (Penjelasan lebih lanjut tentang masalah ini http://phusion.github.io/baseimage-docker/#intro )

Jika Anda ingin wadah yang berjalan dalam mode terpisah setiap saat, saya sarankan Anda gunakan

docker run -d foo

Dengan server ssh di wadah. (Cara termudah adalah mengikuti tutorial dockerizing openssh https://docs.docker.com/engine/examples/running_ssh_service/ )

Atau Anda bisa meluncurkan kembali wadah Anda via

docker start foo

(itu akan terlepas secara default)

Regan
sumber
3
+1 untuk baseimage-docker. Sangat menyenangkan mengetahui ada template dengan saran tentang bagian-bagian keras Docker.
mtmacdonald
Perhatikan bahwa ssh tidak sepenuhnya diperlukan: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat
1
menjalankan mode yang ada di -d sangat membantu. Juga, tautan untuk memulai ssh via Dockerfile membuat hidup saya mudah.
Ravi
56
Lepaskan menggunakan Ctrl-p, Ctrl-q. Saran jawaban ini akan mematikan sebuah wadah.
taranaki
4
Ini bekerja untuk saya (diambil dari jawaban di bawah ini): Mulai dengan -ti -d, kemudian melampirkan dengan docker attach, kemudian lepaskan dengan pertama ctrl + p dan kemudian ctrl + q. Saya pikir, saya bisa menggunakan salah satu cara pintas keyboard.
CGFoX
526

Ketik Ctrl+ plalu Ctrl+ q. Ini akan membantu Anda mengubah mode interaktif ke mode daemon.

Lihat https://docs.docker.com/v1.7/articles/basics/#running-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")
Larry Cai
sumber
4
Tampaknya tidak bekerja dengan (mencoba untuk keluar dari wadah Wekan terlampir).
hazard89
7
Saya telah mengunjungi halaman ini karena saya tidak dapat mengingat kombinasi tombol ini dengan tepat! :-D
Thamme Gowda
10
@ hazard89 ctrl-p, ctrl-q hanya akan berfungsi ketika Anda telah memulai wadah Anda dengan mode interaktif (-it). Jika Anda sudah memulainya dalam mode deamon (-d) dan terpasang padanya, Anda bisa keluar saja dan itu akan tetap berjalan di latar belakang.
Riscie
1
@SlimShady tekan Ctrl + P lalu, Ctrl + Q untuk keluar, bukan salah satu dari mereka, tetapi keduanya dalam urutan itu.
Mohyaddin Alaoddin
160

Saya menggali ini dan semua jawaban di atas sebagian benar. Itu semua tergantung pada bagaimana wadah diluncurkan. Itu datang ke berikut ini ketika wadah diluncurkan:

  • dialokasikan TTY (-t )
  • stdin dibiarkan terbuka ( -i)

^P^Q tidak berfungsi, TETAPI hanya ketika -tdan -idigunakan untuk meluncurkan wadah:

[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 tidak berfungsi, TETAPI hanya ketika -t( tanpa -i ) digunakan untuk meluncurkan wadah:

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

Cara ketiga untuk melepaskan

Ada cara untuk melepaskan tanpa membunuh wadah; Anda perlu shell lain. Singkatnya, menjalankan ini di shell lain terlepas dan membiarkan wadah berjalan 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]$

Mengapa? Karena Anda membunuh proses yang menghubungkan Anda ke wadah, bukan wadah itu sendiri.

berto
sumber
2
cara ketiga bekerja untuk saya. Terima kasih. jika Anda melampirkan ke beberapa contoh dan hanya ingin melepaskan satu. Dapat membunuh proses spesifik: ps -ef | grep attach -> get pid. Lalu: bunuh -9 <pid>
phanhuy152
pkill adalah satu-satunya hal yang bekerja untuk saya setelah melampirkan docker
sm4rk0
Mengapa kita membutuhkan -9. Saya perhatikan jika kita tidak menggunakan -9 itu mematikan kontainer.
Angelo
Sinyal lain adalah itu, sinyal. Mereka memberi tahu proses jenis sinyal apa dan memberikannya kesempatan untuk bertindak dan melakukan sesuatu. The kill -9sinyal tidak. Proses ini dihentikan dan tidak memiliki jalan lain. Dugaan saya adalah bahwa sinyal lain memberi wadah peluang untuk ditutup, sementara -9tidak.
berto
1
Ini sangat membantu. Terima kasih!
Evan Zamir
40

Jika Anda melakukan "docker pasang" id kontainer "Anda masuk ke dalam wadah. Untuk keluar dari wadah tanpa menghentikan wadah Anda harus memasukkan Ctrl+ P+Q

Ashwin
sumber
6
lebih baik untuk Ctrl + P dan Ctrl + Q
sib10
4
Ctrl + P, Q (masih menahan Ctrl);)
dimpiax
mengembalikan saya:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman
31

Saya menganggap jawaban Ashwin sebagai yang paling benar, jawaban lama saya ada di bawah.


Saya ingin menambahkan opsi lain di sini yaitu menjalankan wadah sebagai berikut

docker run -dti foo bash

Anda kemudian dapat memasuki wadah dan menjalankan bash dengan

docker exec -ti ID_of_foo bash

Tidak perlu menginstal sshd :)

PiersyP
sumber
Saya pikir dalam perintah kedua Anda harus mengganti foo dengan id wadah foo
Nehal J Wani
Dalam konteks ini, saya pikir docker attachakan lebih standar, dengan memasang kembali ke bash run pertama. docker execjuga berfungsi di sini, namun itu menciptakan proses bash baru selain yang pertama. Tentu, proses ini dibuat dalam konteks / lingkungan / wadah yang sama dengan yang pertama, namun ini berbeda (analoginya adalah dengan membuka tab terminal baru di emulator terminal favorit Anda).
thiagowfx
20

Cara default untuk melepaskan dari wadah interaktif adalah Ctrl+ P Ctrl+ Q, tetapi Anda dapat menimpanya ketika menjalankan wadah baru atau melampirkan wadah yang ada menggunakan flag --detach-keys .

splintor
sumber
17

Jika dilampirkan docker attach, Anda dapat melepaskannya dengan mematikan proses pemasangan docker. Cara yang lebih baik adalah dengan menggunakan parameter sig-proxy untuk menghindari melewatkan Ctrl + C ke wadah Anda:

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

Opsi yang sama tersedia untuk docker runperintah.

Alexis LEGROS
sumber
6
Meskipun --sig-proxy = false sangat berguna, itu tidak berfungsi untuk wadah yang sudah terpasang yang tidak ditentukan. Masalahnya adalah, setelah memasang tampaknya TIDAK ada cara untuk melepaskan tanpa membunuh proses, termasuk "membunuh proses pasang docker." Cp, Cq tidak berfungsi dengan wadah terlampir, hanya wadah interaktif (seperti yang digunakan pertanyaan).
taranaki
1
Ini harus menjadi jawaban yang diterima, termasuk komentar @taranaki, Ctrl + P, Q tidak berfungsi untukphp:7.3-apache
MKaama
10

Jika Anda hanya ingin melihat output dari proses yang berjalan dari dalam wadah, Anda dapat melakukan yang sederhana docker container logs -f <container id> .

The -fbendera membuatnya begitu bahwa output dari wadah followeddan diperbarui secara real-time. Sangat berguna untuk debugging atau pemantauan.

agupta231
sumber
8

Anda dapat menggunakan --detach-keysopsi saat Anda menjalankan docker attachuntuk menimpa defaultCTRL + P, CTRL+ Qurut (yang tidak selalu bekerja).

Misalnya, saat Anda berlari docker attach --detach-keys="ctrl-a" test dan Anda menekan CTRL+ AAnda akan keluar dari wadah, tanpa membunuhnya.

Contoh lain:

  • docker attach --detach-keys="ctrl-a,x" test - tekan CTRL+A dan kemudian Xuntuk keluar
  • docker attach --detach-keys="a,b,c" test- tekan A, lalu B, laluC untuk keluar

Ambil dari dokumentasi resmi:

Jika Anda mau, Anda bisa mengonfigurasi urutan Docker key untuk dilepaskan. Ini berguna jika urutan default Docker bertentangan dengan urutan kunci yang Anda gunakan untuk aplikasi lain. Ada dua cara untuk menentukan urutan kunci pelepasan Anda sendiri, sebagai penggantian per-wadah atau sebagai properti konfigurasi di seluruh konfigurasi Anda.

Untuk mengganti urutan untuk wadah individu, gunakan --detach-keys="<sequence>"bendera dengan perintah lampiran buruh pelabuhan. Format <sequence>huruf dapat berupa huruf [a-Z], atau ctrl-digabungkan dengan yang berikut ini:

  • az (karakter alfa huruf kecil tunggal)
  • @ (pada tanda)
  • [(braket kiri)
  • \ (dua garis miring ke belakang)
  • _ (garis bawah)
  • ^ (tanda sisipan)

Ini a, ctrl-a, X, atau ctrl-\\nilai-nilai merupakan contoh urutan kunci yang valid. Untuk mengonfigurasi urutan kunci default konfigurasi yang berbeda untuk semua wadah, lihat bagian File konfigurasi .

Catatan: Ini berfungsi sejak versi buruh pelabuhan 1.10+ (pada saat jawaban ini, versi saat ini adalah 18.03)

Constantin Galbenu
sumber
0

Posting lama tetapi keluar begitu saja kemudian mulai lagi ... masalahnya adalah jika Anda menggunakan mesin windows Ctrl p atau Ctrl P terikat untuk mencetak ... keluar dari awal wadah tidak boleh melukai apa pun

tmac
sumber