Bir kabı durdurmadan ayırmanın doğru yolu


313

Docker 1.1.2'de (en son), bir kapsayıcıyı durdurmadan ayırmanın doğru yolu nedir?

Örneğin, eğer denersem:

  • docker run -i -t foo /bin/bash veya
  • docker attach foo (halihazırda çalışan konteyner için)

her ikisi de beni konteynırdaki bir terminale götürür, kabın terminalini durdurmadan nasıl çıkarırım?

exitve CTR+Cher ikisi de kabı durdurur.


"Kapsayıcı" yalnızca işlemlerin çalışabileceği bir dizi kısıtlı ad alanıdır (işlem ad alanı, dosya sistemi ad alanı vb.). Bir ad alanının içinde işleminiz yoksa, bu ad alanı gerçekten var mı? Çekirdek yanıtlayan saat kesintileri & c'nin bulunduğu sanal bir makine gibi değil. ne olursa olsun.
Charles Duffy

Yanıtlar:


166

Güncelleme: Aşağıdaki cevaplarda Ctrl+ belirtildiği gibi p, Ctrl+ qşimdi etkileşimli modu daemon moduna dönüştürecek.


Peki Ctrl+ C(veya Ctrl+ \) sizi konteynırdan ayırmalı, ancak konteyneri öldürecek çünkü ana işleminiz bir bash.

Liman işçisi hakkında küçük bir ders. Kap gerçek bir tam işlevsel işletim sistemi değil. Bir kapsayıcı çalıştırdığınızda başlattığınız işlem PID 1'i alır ve init gücü alır. Böylece bu işlem sonlandırıldığında, arka plan programı yeni bir işlem başlatılana kadar kapsayıcıyı durdurur (docker başlatma yoluyla) (Konu hakkında daha fazla açıklama http://phusion.github.io/baseimage-docker/#intro )

Her zaman bağımsız modda çalışan bir kap istiyorsanız, kullanmanızı öneririz

docker run -d foo

Kapsayıcı üzerinde bir ssh sunucusu ile. (en kolay yol, dockerizing openssh öğreticisini takip etmektir https://docs.docker.com/engine/examples/running_ssh_service/ )

Veya konteynırınızı

docker start foo

(varsayılan olarak ayrılacaktır)


3
Baseimage-docker için +1. Docker'ın zor kısımları hakkında tavsiye içeren bir şablon olduğunu bilmek harika.
mtmacdonald


1
içerilen -d modunda çalıştırmak çok yardımcı oldu. Ayrıca, ssh'ı Dockerfile aracılığıyla başlatma bağlantısı hayatımı kolaylaştırdı.
Ravi

56
Ctrl-p, Ctrl-q kullanarak ayırın . Bu cevabın tavsiyesi bir konteyneri öldürecek.
taranaki

4
Bu benim için çalıştı (aşağıdaki cevaptan alınmıştır): ile başlayın -ti -d, sonra takın docker attach, sonra ilk ctrl + p ve sonra ctrl + q ile ayırın . Klavye kısayollarından sadece birini kullanabileceğimi düşündüm.
CGFoX

526

Tür Ctrl+ psonra Ctrl+ q. Etkileşimli modu arka plan moduna çevirmenize yardımcı olacaktır.

Bkz. 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")

4
(Ekli bir Wekan kapsayıcısından çıkmaya çalışırken) ile çalışmıyor gibi görünüyor.
danger89

7
Bu sayfayı çok kez ziyaret ettim çünkü bu tuş kombinasyonunu tam olarak hatırlayamadım! :-D
Thamme Gowda

10
@ danger89 ctrl-p, ctrl-q yalnızca kapsayıcınızı etkileşimli mod (-it) ile başlattığınızda çalışır. Eğer deamon modunda (-d) başlattıysanız ve ona bağlıysanız, sadece çıkabilirsiniz ve yine de arka planda çalışır.
Riscie

1
@SlimShady önce Ctrl + P'ye, sonra çıkmak için Ctrl + Q'ya basın, bunlardan biri değil, her ikisi de bu sırayla.
Mohyaddin Alaoddin

160

Buna girdim ve yukarıdaki tüm cevaplar kısmen doğru. Her şey kabın nasıl başlatıldığına bağlıdır. Konteyner başlatıldığında aşağıdakilere iner:

  • bir TTY ayrılmıştı ( -t)
  • stdin açık bırakıldı ( -i)

^P^Q çalışır, ANCAK sadece -tve -ikonteyner başlatmak için kullanılır:

[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 çalışır, ANCAK sadece -t( olmadan -i kabı başlatmak için kullanılır):

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

Ayrılmanın üçüncü yolu

Ancak konteyneri öldürmeden sökmenin bir yolu vardır; başka bir mermiye ihtiyacınız var. Özetle, bunu başka bir kabukta çalıştırmak kapsayıcıyı çalışır halde bıraktı 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]$

Neden? Çünkü sizi konteynerin kendisine değil, konteynere bağlayan süreci öldürüyorsunuz.


2
üçüncü yol benim için çalışıyor. Teşekkürler. birkaç örneğe ekliyorsanız ve yalnızca bir örneğinden ayırmak istiyorsanız. Belirli bir süreci öldürebilir: ps -ef | grep attach -> pid al. Sonra: -9 <pid> öldür
phanhuy152

pkill docker
ekledikten

Neden -9'a ihtiyacımız var. Ben -9 kullanmazsak kapıyı kapattığını fark ettim.
Angelo

Diğer sinyaller, sinyallerdir. Sürece ne tür bir sinyal söyler ve ona bir şeyler yapma ve yapma şansı verir. kill -9Sinyal yok. Süreç feshedilir ve başvurusu yoktur. Benim tahminim, diğer sinyaller konteynere kapanma şansı verirken -9değil.
berto

1
Bu süper yardımcı oldu. Teşekkürler!
Evan Zamir

40

"Docker" konteyner id "eklerseniz, konteynere girersiniz. Konteyneri durdurmadan konteynırdan çıkmak için Ctrl+ P+ girmeniz gerekir.Q


6
Ctrl + P ve Ctrl + Q
sib10 için daha iyi

4
Ctrl + P, Q (hala Ctrl tutuyor);)
dimpiax

beni döndürür:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman

31

Ashwin'in cevabının en doğru olduğunu düşünüyorum, eski cevabım aşağıda.


Kapsayıcıyı aşağıdaki gibi çalıştırmak için buraya başka bir seçenek eklemek istiyorum

docker run -dti foo bash

Daha sonra kapsayıcıya girebilir ve

docker exec -ti ID_of_foo bash

Sshd kurmaya gerek yok :)


İkinci komutta
foo'yu foo'nun

Bu bağlamda, docker attachilk bash koşusuna yeniden bağlanarak daha standart olacağını düşünüyorum . docker execburada da çalışır, ancak birincisine ek olarak yeni bir bash süreci oluşturur. Elbette, süreç birincinin aynı bağlamı / ortamı / kabı içinde oluşturulur, ancak farklıdır (bir benzetme, en sevdiğiniz terminal emülatöründe yeni bir terminal sekmesi açmak olacaktır).
thiagowfx

20

Etkileşimli bir kapsayıcıdan ayırmanın varsayılan yolu Ctrl+ P Ctrl+ ' dır Q, ancak yeni bir kapsayıcı çalıştırırken veya --detach-keys bayrağını kullanarak var olan kapsayıcıya eklerken onu geçersiz kılabilirsiniz .


16

Eğer docker attachtaktıysanız, liman işçiliği takma işlemini öldürerek sökebilirsiniz. Daha iyi bir yol, Ctrl + C'yi kabınıza geçirmemek için sig-proxy parametresini kullanmaktır:

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

docker runKomut için aynı seçenek kullanılabilir .


6
Gerçi --sig-vekil = false son derece yararlıdır, buna belirtilmedi kendisi için zaten bağlı konteynerler için çalışma yapmaz. Sorun, ekledikten sonra "docker ekleme işlemini öldürmek" de dahil olmak üzere, süreci öldürmeden ayırmanın HİÇBİR yolu yok gibi görünüyor. Cp, Cq, ekli kaplarla çalışmaz, yalnızca etkileşimli olanlarla (sorunun kullandığı gibi) çalışır.
taranaki

1
Bu, @taranaki'nin yorumu, Ctrl + P, Q için çalışma dahil olmak üzere kabul edilen cevap olmalıdırphp:7.3-apache
MKaama

10

İşlemin çıktısını kaptan görmek istiyorsanız, basit bir işlem yapabilirsiniz docker container logs -f <container id>.

-fKabın çıkış böylece bayrak yapan followedgerçek zamanlı olarak güncellenir ve. Hata ayıklama veya izleme için çok kullanışlıdır.


8

Sen kullanabilirsiniz --detach-keysçalıştırdığınızda seçeneği docker attachvarsayılan geçersiz kılmak için CTRL+ P, CTRL+ Qdizisini (her zaman değil iş).

Örneğin, koştuğunuzda docker attach --detach-keys="ctrl-a" testve CTRL+ tuşuna bastığınızda Akaptan öldürmeden çıkacaksınız.

Diğer örnekler:

  • docker attach --detach-keys="ctrl-a,x" test- çıkmak için önce CTRL+Ave sonraX
  • docker attach --detach-keys="a,b,c" test- çıkmak için önce A, sonra B, ardındanC

Resmi belgelerden alıntı:

İsterseniz, ayırmak için Docker anahtar dizisini geçersiz kılabilirsiniz. Docker varsayılan sırası, diğer uygulamalar için kullandığınız tuş sırası ile çakışıyorsa bu yararlıdır. Kapsayıcı başına geçersiz kılma veya tüm yapılandırmanızda bir yapılandırma özelliği olarak kendi ayırma anahtarı dizinizi tanımlamanın iki yolu vardır.

Tek bir kapsayıcı sırasını geçersiz kılmak için --detach-keys="<sequence>", docker attach komutuyla bayrağı kullanın. Bunun biçimi <sequence>bir harf [a-Z]veya ctrl-aşağıdakilerden herhangi biriyle birleştirilir:

  • az (tek küçük harfli alfa karakter)
  • @ (işaretini)
  • [(sol köşeli ayraç)
  • \ (iki geriye eğik çizgi)
  • _ (vurgulamak)
  • ^ (düzeltme işareti)

Bu a, ctrl-a, Xya da ctrl-\\değerleri geçerli anahtar dizilerinin örnekleridir. Tüm kapsayıcılar için farklı bir yapılandırma varsayılan anahtar sırası yapılandırmak için Yapılandırma dosyası bölümüne bakın.

Not: Bu, docker sürüm 1.10+'den beri çalışır (bu cevap sırasında geçerli sürüm 18.03'tür)


0

Eski yazı ama sadece çıkmak sonra tekrar başlatın ... sorun bir Windows makine Ctrl p veya Ctrl P yazdırmak için bağlı ise ... konteyner başlangıç ​​hiçbir şey incitmemelidir

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.