Docker'ın sürecini nasıl ekler ve çıkarırsınız?


459

Bir docker işlemine ekleyebilirim ama Ctrl+ condan ayrılmak için çalışmıyor. exittemelde süreci durdurur.

Sürecin çalışması için zaman zaman bazı değişiklikler yapmak üzere eklenmesi ve ardından ayrılması için önerilen iş akışı nedir?


4
Nsenter kullanırken, sadece Ctrl-D dışarı.
user2105103

Does kapanış xterm, konsolevb işi? Benim için çalışıyor (müstakil).
Vytenis Bivainis

Yanıtlar:


668

Kabuktan çıkmadan tty'yi ayırmak için önce çıkış sırasını Ctrl+ Pardından Ctrl+ işaretini kullanın Q. Daha fazla ayrıntı burada .

Bu kaynaktan ek bilgi :

  • docker run -t -i → docker eki ile sökülebilir ^P^Qve yeniden takılabilir
  • docker run -i → ile ayrılamaz ^P^Q; stdin'i bozacak
  • docker run → ile sökülemez ^P^Q; SIGKILL istemcisi olabilir; docker eki ile yeniden bağlayabilir

46
Dokümanlar'da açıklandığı gibi çalışsaydı bu harika bir cevap olurdu.
allingeek

20
Ben de -it ile çalışırken, aynı zamanda temizleme bayrağı (--rm) ile konteyner başlatırsanız ayırma sırası başarısız olduğunu bulundu. Bu bazıları için açık olabilir, ama beni kabul etmek istediğimden daha sık ısırıyor.
allingeek

7
Başka bir seçenek sadece terminal pencerenizi veya cmd-w :)
kapatmaktır

3
Yapılandırılabilir ayırma tuşlarını, örneğin "detachKeys": "ctrl-a,a".docker / config.json dosyanızda veya --detach-keys "ctrl-a,a"iliştirilmiş vb. Komut satırında ayarlayabilirsiniz .
Matthew Hannigan

4
Ctrl + Zayrılmaz; sadece sürecin arka planı. Ayrılmakla aynı şey değildir ve bir performans cezası taşır.
Zenexer

178

Ayrıca göz atın seçeneği :--sig-proxy

docker attach --sig-proxy=false 304f5db405ec

Ardından ayırmak için CTRL+ tuşunu kullanınc


4
Eklemek yerine çalıştırmayla bu denemeyi denemek için denedim: docker run -ti --sig-proxy=false busybox top Bu işe yaramadı, süreç ctrl-c ile öldürüldü, ancak docker run -t -sig-proxy=false busybox top işe başlamak ve ctrl-c ile bırakmayı mümkün görünüyordu
Henning

Ctrl-ckonteyner de durur.
Evan Hu

Burada listelenenlerden Docker 19.03.5 çalıştıran Debian 9 sunucusunda çalışan tek çözümdür. Soru şu: bu neden ekleme komutları için varsayılan ayar değil? En yaygın kullanım durumu gibi görünüyor.
fviktor

Ctrl-p, Ctrl-q dizisi benim için çalışmıyor (docker konteyner xyz iliştirmek olarak başlatıldı) .. ama bu işe yarıyor. Teşekkürler @czerasz
PravyNandas

92

Dosyalarda biraz değişiklik yapmak veya işlemleri incelemek istiyorsanız, muhtemelen istediğiniz başka bir çözüm.

Mevcut kapsayıcıdan yeni bir işlem yürütmek için aşağıdaki komutu çalıştırabilirsiniz:

sudo docker exec -ti [CONTAINER-ID] bash

bash kabuk ile yeni bir işlem başlatacak ve doğrudan Ctrl+ Cile kaçabilir , orijinal işlemi etkilemez.


6
Bu işe yaradı, orijinal işlemi etkilemeden işiniz bittiğinde "exit" yazabilirsiniz.
Eko3alpha

Bu, çalışan bir kaba bağlamak için harika bir yoldur. Peki ya konteynerde çalışan bir süreçim varsa ve bu işlemi yeniden başlatmak istersem ne olur? Ah, sadece eski süreci öldürebilir, yenisini yeniden başlatabilirim ve etkileşimli bir tty olduğu için çalışan Cp, Cq'yi kullanabilirim. Ben de --sig-proxy = false yöntemini seviyorum, ama bu daha çok yönlü ve mevcut işlemin bozulmasını zorlamıyor.
taranaki

"attach", Docker ile belirli bir anlama sahiptir ve execdeğildir.
frnhr

48

Bunun duruma bağlı olması gerektiğini düşünüyorum.Örneğin aşağıdaki kapsayıcıyı alın:

# 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 attachKonteyneri takmak için " " kullanın :

"Yana docker attach" olmaz çalıştırmak eğer öyleyse, yeni bir tty tahsis, ancak orijinal koşu tty yeniden exitkomutunu, bu çalışan konteyner çıkış neden olur:

# 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

Bu nedenle, gerçekten çalışan kapsayıcı çıkışı yapmak istemiyorsanız, Ctrl+ p+ Ctrl+ kullanmanız gerekir q.

(2) " docker exec" kullanın

"Yana docker exec" olacak yeni bir tty tahsis, bu yüzden kullanmak gerektiğini düşünüyorum exityerine Ctrl+ p+ Ctrl+ q.

Kaptan çıkmak için Ctrl+ p+ Ctrl+ yürütülüyor 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

Sonra tekrar kapsayıcıya giriş yapın, bashönceki docker execkomutta işlemin hala hayatta olduğunu göreceksiniz (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

Çalışan bir konteynerden ayırmak için ^P^Qtuşunu kullanın (tuşunu basılı tutun Ctrl, tuşuna basın P, tuşuna basın Q, bırakın Ctrl).

Bir yakalama var: Bu yalnızca kap hem -t ve ile başlatılmışsa çalışır -i.

Bu seçeneklerden biri (veya her ikisi) olmadan başlatılan çalışan bir kapsayıcı varsa ve eklerseniz docker attach, ayırmanın başka bir yolunu bulmanız gerekir. Seçtiğiniz seçeneklere ve çalışan programa bağlı olarak ^C, tüm kapsayıcıyı öldürebilir. Denemeniz gerekecek.

Başka bir yakalama: Kullandığınız programlara bağlı olarak terminaliniz, kabuğunuz, SSH istemciniz veya çoğullayıcı ya ^Pveya ^Q(genellikle ikincisi) tarafından kesiliyor olabilir . Sorunun bu olup olmadığını sınamak için, --detach-keys zbağımsız değişkeni çalıştırmayı veya iliştirmeyi deneyin . Artık zherhangi bir değiştirici kullanmadan tuşuna basarak ayırabilirsiniz . Bu işe yararsa başka bir program karışıyor. Bu soruna geçici bir çözüm bulmak için en kolay yolu , bazı POSIX sistemlerini kullanarak kendi ayırma dizini ayarlamaktır , ancak ben bunu yararlı bulmadım.--detach-keys bağımsız değişkeni . (Örneğin, ile çıkmak için ^Kkullanın --detach-keys 'ctrl-k'.) Alternatif olarak, terminalinizdeki veya başka bir müdahale programınızdaki tuşlara müdahale etmeyi devre dışı bırakmayı deneyebilirsiniz. Örneğin , terminalin araya girmesini engelleyebilir stty start ''veyastty start undef^Q


2
Süper kesin açıklama, çekicilik gibi çalıştı
Meir Gabay

27

başka hiçbir şey çalışmadığında, yeni bir terminal açın :

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

Ne tuzak! Teşekkür ederim, işe yarayan tek şey bu. -9gerekli değildi.
Heath Raftery

Bu da konteyneri öldürür - belki de hangi bayrakların ayarlandığına bağlı.
AdamAL

1
Lütfen dikkat iki pids varsa Birincisi üstüdür görüntülenir. Sen gerektiğini İkinci süreç numarasını kullanır öldürmek için docker attachonun ebeveyni değil.
joeytwiddle

11

Sadece tutun kaptan ayırmak için Ctrlbasın P+Q .

Çalışan bir kapsayıcıya eklemek için:

$ docker container attach "container_name"

9

Ben de aynı sorunu vardı, ctrl- Pve Qişe yaramaz, ne de ctrl- C... sonunda başka bir terminal oturumu açtım ve "docker stop containerid " ve "docker start containerid " yaptım ve iş bitti. Tuhaf.


Kapsayıcıyı --rmbayrakla başlattıysanız bu çalışmaz . Ctrl+Pve Ctrl+Qkapsayıcıyı -itbayrakla başlattıysanız çalışır .
Aswath K

4

Aynı kabuk olarak, tutun ctrlanahtar ve basın tuşları psonraq


3
Bu yalnızca kapsayıcıyı -itbayrakla başlattıysanız çalışır .
Aswath K


1
  1. Yeni bir terminal açın
  2. Çalışan kapsayıcı kimliğini bulma docker ps
  3. Konteyneri öldür docker kill ${containerId}

0

bir liman işleyici işlemini durdurmak ve bağlantı noktalarını serbest bırakmak için, ilk önce ctrl- ckaptan çıkmak için, ardından çalışan kapsayıcıların listesini bulmak için docker ps komutunu kullanın. Ardından, bu işlemi durdurmak ve bağlantı noktalarını serbest bırakmak için docker kapsayıcı durağını kullanabilirsiniz. Ad sütununda adı veren docker ps komutundan bulabileceğiniz kapsayıcı adı. Umarım bu sorularınızı çözer ....


0

Arka plana gitmek için sadece docker işlemine ihtiyacınız varsa,

Ctrl + Z

Bunun gerçek bir ayrılma olmadığını ve bir performans cezası ile geldiğini unutmayın. (İle ön plana dönebilirsiniz.bg Komut ).

Başka bir seçenek, artık ihtiyacınız yoksa, terminalinizi kapatmaktır.


0

Ben aynı sorunu koştu herkes için yaptım (ayırma anahtarı ayarlarken bile konteyner öldürmeden ayırmak olamaz) ......

Konteynırlarınızla docker-compose up -d

kullanmak yerine docker attach {container name}kuyruk günlüğünü görüntülemek için ....

dene docker-compose logs -f {service name} ctrl- ckonteynerini öldürmeden kütük kuyruğunu öldür

{service name}docker-compose.yml dosyanızın yanında listelenen hizmettir .. (ör. container name = elk_logstash_1 -> service name = logstash

HTH


0

Güncelleme

Kapsayıcı sorunlarını gidermek için tipik olarak STDOUT'un ne gösterdiğini görmek için docker eklentisini kullandım. Yeni buldumdocker logs --follow 621a4334f97b , bu da STDOUT'u konteynır operasyonunu etkilemeden ctrl + c'yi kapatırken görmeme izin veriyor! Her zaman istediğim gibi.

... doğal olarak kendi kapsayıcı kimliğinizi kullanmanız gerekir.

Orijinal Yanıt

Konteyneri çalışır halde bırakmak istedim ama konteyneri başlatmadan taktım -it. Benim çözümüm bunun yerine SSH bağlantımı feda etmekti (kapları çalıştıran makineye SSH kullandım). Bu ssh oturumunu öldürmek konteyneri sağlam bıraktı ama beni ondan ayırdı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.