Zaten yeni bir TTY ile çalışan bir Docker kapsayıcısına nasıl girilir


545

Apache hizmetini ön planda çalıştıran bir kapsayıcı var. İçinde "etrafında dürtmek" ve dosyaları incelemek için başka bir kabuk kabına erişmek istiyorum. Şu anda, konteynere eklersem, Apache arka plan programına bakıyorum ve herhangi bir komut çalıştıramıyorum.

Çalışan bir konteynere başka bir tty eklemek mümkün mü? Muhtemelen, Docker'ın sadece LXC konteynırlarını sarması gerçeğinden faydalanabilir miyim? Denedim sudo lxc-console -n [container-id] -t [1-4]ama sadece bir tty kullanılabilir ve apache daemon çalışan biri gibi görünüyor. Yapı sırasında birden fazla lxc konsolunu etkinleştirmenin bir yolu var mı?

Daha doğrusu olurdu değil yapılandırmak ve bir openssh hizmeti mümkünse kabı kurmak.


7
Denedin docker attach [conainer-id]mi
shabbychef

13
@ shabbychef docker eki değişmedikçe, attach komutu yeni bir değil, çalışan tty'ye eklenir, bu nedenle soru başlığı "... yeni TTY ile" dir. Bu yüzden aşağıdaki cevap attach komutunu kullanmaz.
Programcı

1
1.3'ten beri bu cevapta
Thomasleveil

Yanıtlar:


1061

Docker 1.3 ile yeni bir komut var docker exec. Bu, çalışan bir liman işçisine girmenizi sağlar:

docker exec -it [container-id] bash

30
Bunu doğru cevap olarak değiştirdim (kendimden), çünkü soru sırasında etrafta olmayan bu yeni yöntem en iyi mevcut yöntem IMO'dur.
Programcı

3
Ancak bunun execnormal bir terminal görevi görmediğine dikkat edin . Örneğin, kapsayıcı içinde bir kez kullanıcı değiştiremezsiniz.
Pithikos

3
@Pithikos: Ben bir kabuk çalıştırmak ve sonra su someuserkullanıcı değiştirmek için exec kullanabilirsiniz . Docker 1.4.1 Koşu
lsh

2
Bu tartışmayı okuyan herkese dikkat edin. docker exec -itSonunda tamamen işlevsel bir sahte tty sağlayacağından eminim , ancak şimdilik (Docker sürüm 1.9.1), bazı eksiklikler var: github.com/docker/docker/issues/8755
blong

18
'exec: "bash": yürütülebilir dosya $ PATH' içinde bulunmazsa şunu deneyebilirsiniz: docker exec -it [container-id] / bin / sh
Dai Kaixian

42

SSH kullanmadan bir konteynere girmek için Jérôme Petazzoni'nin 'nsenter' adlı aracını kullanmalısınız. Bkz. Https://github.com/jpetazzo/nsenter

Basitçe çalıştırarak yükleyin: docker run -v /usr/local/bin:/target jpetazzo/nsenter

Ardından docker-enter <container-id>, kapsayıcıya girmek için komutu kullanın.


Bu doğru yol. Bkz blog .
Jesse Glick

5
Docker 1.3 ile yeni bir komut var docker exec. Bu, çalışan bir liman işçisine girmenize izin verir: docker exec -it <container-id> bash(aşağıdaki
cevabıma

5
Mu docker-enterhala var? Bana veriyor command not found.
Snowcrash

22

Güncelleme

Docker 0.9'dan itibaren, aşağıdaki adımların çalışması için, şimdi daemon'u yeniden başlatmadan önce /etc/default/dockerdosyayı '-e lxc'docker daemon başlangıç ​​seçeneğiyle güncellemek gerekiyor (bunu ana bilgisayarı yeniden başlatarak yaptım).

/ etc / default / docker dosyasına güncelleme

Hepsi bu çünkü ...

... [docker 0.9], kapsayıcıları başlatmak için LXC dışında başka bir API kullanımını mümkün kılmak için yeni bir "motor sürücüsü" soyutlaması içeriyor. Ayrıca, LXC araçlarını kullanmadan Kontrol Gruplarını işleyebilen yeni bir API kütüphanesine (libcontainer) dayalı yeni bir motor sürücüsü sağlar. Ana sorun, konteynır üzerinde eylemler gerçekleştirmek için lxc-attach'a güveniyorsanız, kabın içinde bir kabuk başlatmak gibi, geliştirme ortamı için delicesine faydalıdır ...

kaynak

Bunun, yalnızca ana bilgisayar 0.11'in yeni ana bilgisayar isteğe bağlı ağ özelliklerinin "çalışmasını" engelleyeceğini ve yalnızca geri döngü arayüzünü göreceğinizi lütfen unutmayın . hata raporu


Farklı bir sorunun çözümünün de bunun çözümü olduğu ortaya çıktı :

... ps -notrunctam lxc kapsayıcı kimliğini almak için docker'ı kullanabilir ve sonra lxc-attach -n <container_id>o kaptaki run bash komutunu root olarak kullanabilirsiniz.

Güncelleme: Kullanımdan kaldırılmak ps --no-truncyerine yakında kullanmanız gerekecek ps -notrunc.

resim açıklamasını buraya girin Kapsayıcı kimliğinin tamamını bulun

resim açıklamasını buraya girin Lxc attach komutunu girin.

resim açıklamasını buraya girin Top, docker'ın çalıştırdığı apache sürecimi gösterir.


Yani, bunu sadece Docker ile yapmanın bir yolu yok, değil mi? Şahsen LXC'de kendimi karıştırmamayı tercih ediyorum.
qkrijger

Bash'ı başlatmak için lxc-attach ile komut çalıştırmanın bir yolu var mı? Teşekkür!!
joselo

doğru olduğunu bildiğim kadarıyla @qkrijger. LXC'yi “karıştırma” konusunda neden endişeleniyorsunuz? Docker'ın LXC üzerine inşa edildiğini anlıyor musunuz?
Programcı

@joselo Sorunuzu anlamadım, ancak daha ayrıntılı yeni bir yayın oluşturmanızı öneririm? Bir docker işlemine bash veya -d vb.
Programster

@programster evet, bunu anlıyorum :) Yine de, LXC'yi doğrudan Docker ile birlikte kullanmak hack gibi geliyor. Eğlenceli, ama gerçekten bakımı mümkün değil. Genel olarak, bir kişinin seçmeyi seçtiği soyutlama katmanında kodlaması gerekir. Gerçekten LXC'nin kendisine ihtiyacınız varsa,
Docker'da

7

İlk adım konteyner kimliği olsun:

docker ps

Bu size benzer bir şey gösterecek

KONTEYNER KİMLİĞİ GÖRÜNTÜ KOMUTU OLUŞTURULMUŞ DURUM LİMANLARI İSİMLERİ

1170fe9e9460 localhost: 5000 / python: env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" 26 saniye önce 25 saniye önce 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0

1170fe9e9460 bu durumda kapsayıcı kimliği.

İkinci olarak , bağlantı istasyonuna girin:

docker exec -it [container_id] bash

yukarıdaki durumda yani: docker exec -it 1170fe9e9460 bash


5

Konteyner içinde tmux / GNU Ekranı çalıştırmaya ne dersiniz? Basit bir şekilde istediğiniz kadar vty erişmek için daha yumuşak bir yol gibi görünüyor:

$ docker attach {container id}

Bir kapsayıcıya erişmek (örneğin hata ayıklamak için) isteyeceğinizi biliyorsanız bu iyi bir çözümdür, ancak bu, var olan bir kapsayıcıya bakmak istediklerini bildiren OP'ye yardımcı olmaz.
Luca Spiller

1
Bu cevapla ilgili sorunum, insanların zaten kullanımı hakkında sordukları docker attachve ben şunu işaret ettim:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
Programster

Konteyner zaten çalışıyorsa bu çözüm size yardımcı olmaz, ancak daha önce bir çoklayıcıyı bırakmaya dikkat ederseniz ek ttylere ihtiyacınız olmaz ... Aslında tmux kullanmaya başladığımdan beri bir tty kullanıyorum ve bir kereden beri tmux'a ihtiyacım olan her şeyi yapmak için sadece bir tane istediğim kadar vtys üretebilirim.
cig0

4

nsenterbunu yapar. Bununla birlikte, basit bir şekilde bir konteynere girmem gerekiyordu ve nsenter ihtiyaçlarım için yeterli değildi. Bazı durumlarda buggy (siyah ekran artı -wd bayrağı çalışmıyor). Ayrıca belirli bir kullanıcı olarak ve belirli bir dizinde oturum açmak istedim.

Kaplara girmek için kendi aracımı yaptım. Bunu şu adreste bulabilirsiniz: https://github.com/Pithikos/docker-enter

Kullanımı kadar kolay

./docker-enter [-u <user>] [-d <directory>] <container ID>

Sadece denedim, çok havalı! Ubuntu üzerinde sudo çalıştırmak için apt-get kurmak-essential -y gcc docker-enter.c -o docker-girmek sudo ./docker-enter <short-container-id> Tam kimliği almak zorunda değilim güzel lxc-attach -n Codebase kötü niyetli bir şey aramak için bir bütün olarak hızlı bir şekilde tarayabilirsiniz yeterince kısa.
Programcı

Uygulamada emülasyon / docker-enter olarak github.com/steveeJ/personal-portage-overlay adresinden gentoo'da bir ebuild yaptım .
stefanjunker

Ben ubuntu kullanıcıları için bu otomatik bir öğretici / komut dosyası eklemiş programster.blogspot.co.uk/2014/01/...
Programster

2

"Nsinit" yolu:

nsinit'i yükle

git clone git@github.com:dotcloud/docker.git
cd docker
make shell

kabın içinden:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

dışarıdan:

docker cp id_docker_container:/go/bin/nsinit /root/

kullan

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash

2
docker exec -t -i container_name /bin/bash

Sizi konteynır konsoluna götürecek.


Ben de aynı soruyu yaşadım çünkü bu soruya indi. Benzer görünen cevap ben değiştirene kadar benim için işe yaramadı. Bunu silebilirim.
Danstan

2
docker exec -ti 'CONTAINER_NAME' sh

or

docker exec -ti 'CONTAINER_ID' sh

1

Powershell kullanarak çalışan bir microsoft / iis daemon olarak kullanarak

docker exec -it <nameOfContainer> powershell

Sorunun linux tabanlı bir konteynerle ilgili olduğu anlaşılıyor. Bu yanıt, muhtemelen yalnızca Windows tabanlı bir kapsayıcı varsa (veya PowerShell'in .NET Core sürümü yüklüyse çalışır, örneğin PowerShell 6 veya üstü).
Manfred

0

On Windows 10'a , ben liman işçisi yüklü. Bir kapta Jnekins çalıştırıyorum ve aynı hata iletisiyle karşılaştım. Bu sorunu çözmek için adım adım kılavuz:

Adım 1: Gitbash'i açın ve docker run -p 8080: 8080 -p 50000: 50000 jenkins'i çalıştırın.

Adım 2: Yeni bir terminal açın.

Adım 3: Çalışan konteyner listesini almak için "docker ps" yapın. Kapsayıcı kimliğini kopyalayın.

4. Adım: Şimdi "docker exec -it {container id} sh" veya "docker exec -it {container id} bash" yaparsanız, "giriş cihazı TTY değil" e benzer bir hata mesajı alırsınız. mintty kullanarak komutu 'winpty' ile önek olarak eklemeyi deneyin "

Adım 5: " $ winpty docker exec -it {container id} sh komutunu çalıştırın "

vola !! Artık terminalin içindesiniz.

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.