Cara masuk dalam wadah Docker sudah berjalan dengan TTY baru

545

Saya memiliki sebuah wadah yang menjalankan layanan Apache di latar depan. Saya ingin dapat mengakses wadah dari shell lain untuk "melihat-lihat" di dalamnya dan memeriksa file. Saat ini, jika saya lampirkan ke wadah, saya dibiarkan menatap daemon Apache dan tidak dapat menjalankan perintah apa pun.

Apakah mungkin untuk menempelkan tty lain ke wadah yang sedang berjalan? Mungkin, saya bisa memanfaatkan fakta bahwa Docker sebenarnya hanya membungkus kontainer LXC? saya telah mencobasudo lxc-console -n [container-id] -t [1-4] tetapi tampaknya hanya satu tty yang tersedia dan itu adalah yang menjalankan daemon apache. Mungkin ada cara untuk mengaktifkan beberapa konsol lxc selama proses pembuatan?

Saya lebih suka tidak mengkonfigurasi dan membangun wadah dengan layanan openssh jika memungkinkan.

Programster
sumber
7
Apakah kamu sudah mencoba docker attach [conainer-id]?
shabbychef
13
@shabbychef kecuali jika docker attach telah berubah, perintah attach melekat pada tty yang sedang berjalan, bukan yang baru, maka judul pertanyaannya adalah "... with new TTY". Inilah sebabnya mengapa jawaban di bawah ini tidak menggunakan perintah attach.
Programster
1
Karena 1.3 ada cara yang lebih mudah seperti dijelaskan pada jawaban ini
Thomasleveil

Jawaban:

1061

Dengan docker 1.3, ada perintah baru docker exec. Ini memungkinkan Anda untuk memasuki buruh pelabuhan:

docker exec -it [container-id] bash
Michael_Scharf
sumber
30
Saya telah mengubah ini menjadi jawaban yang benar (dari saya sendiri) karena metode baru ini, yang tidak ada pada saat pertanyaan, adalah metode IMO terbaik saat ini.
Programster
3
Perhatikan bahwa execitu tidak bertindak sebagai terminal normal. Misalnya, Anda tidak dapat mengubah pengguna sekali di dalam wadah.
Pithikos
3
@Pithikos: Saya dapat menggunakan exec untuk menjalankan shell dan kemudian su someusermengubah pengguna. Menjalankan Docker 1.4.1
lsh
2
Catatan untuk siapa pun yang membaca diskusi ini. Saya yakin docker exec -itpada akhirnya akan memberikan pseudo tty yang berfungsi penuh, tetapi untuk saat ini (Docker versi 1.9.1), ada beberapa kekurangan: github.com/docker/docker/issues/8755
blong
18
jika Anda mendapatkan kesalahan 'exec: "bash": file yang dapat dieksekusi tidak ditemukan dalam $ PATH' Anda dapat mencoba ini: buruh pelabuhan exec-it [container-id] / bin / sh
Dai Kaixian
42

Anda harus menggunakan alat Jérôme Petazzoni yang disebut 'nsenter' untuk memasuki sebuah wadah tanpa menggunakan SSH. Lihat: https://github.com/jpetazzo/nsenter

Instal dengan hanya menjalankan: docker run -v /usr/local/bin:/target jpetazzo/nsenter

Kemudian gunakan perintah docker-enter <container-id>untuk memasuki wadah.

Hyperfocus
sumber
Ini jalan yang benar. Lihat blog .
Jesse Glick
5
Dengan docker 1.3, ada perintah baru docker exec. Ini memungkinkan Anda untuk memasuki buruh pelabuhan: docker exec -it <container-id> bash(lihat jawaban saya di bawah)
Michael_Scharf
5
Apakah docker-entermasih ada? Itu memberi saya command not found.
Snowcrash
22

Memperbarui

Pada docker 0.9, untuk langkah-langkah di bawah ini untuk sekarang berfungsi, kita sekarang harus memperbarui /etc/default/dockerfile dengan '-e lxc'opsi startup ke docker daemon sebelum me-restart daemon (saya melakukan ini dengan me-reboot host).

memperbarui ke file / etc / default / docker

Ini semua karena ...

... itu [buruh pelabuhan 0,9] berisi abstraksi "driver mesin" baru untuk memungkinkan penggunaan API selain LXC untuk memulai kontainer. Ini juga menyediakan driver mesin baru berdasarkan perpustakaan API baru (libcontainer) yang mampu menangani Grup Kontrol tanpa menggunakan alat LXC. Masalah utama adalah bahwa jika Anda mengandalkan lxc-attach untuk melakukan tindakan pada wadah Anda, seperti memulai sebuah shell di dalam wadah, yang sangat berguna untuk lingkungan pengembangan ...

sumber

Harap dicatat bahwa ini akan mencegah fitur opsional hanya host host jaringan docker 0.11 dari "berfungsi" dan Anda hanya akan melihat antarmuka loopback. laporan bug


Ternyata solusi untuk pertanyaan yang berbeda juga merupakan solusi untuk pertanyaan ini:

... Anda bisa menggunakan buruh pelabuhan ps -notruncuntuk mendapatkan ID kontainer lxc penuh dan kemudian menggunakan lxc-attach -n <container_id>run bash dalam wadah itu sebagai root.

Pembaruan: Anda akan segera perlu menggunakan ps --no-truncalih-alih ps -notruncyang sudah usang.

masukkan deskripsi gambar di sini Temukan ID kontainer lengkap

masukkan deskripsi gambar di sini Masukkan perintah lxc attach.

masukkan deskripsi gambar di sini Top menunjukkan proses apache saya menjalankan buruh pelabuhan itu dimulai.

Programster
sumber
Jadi, tidak ada cara untuk melakukan ini hanya dengan Docker, kan? Saya pribadi lebih suka untuk tidak mencampur LXC sendiri.
qkrijger
Apakah ada cara untuk menjalankan perintah dengan lxc-attach sebagai gantinya untuk meluncurkan bash? Terima kasih!!
joselo
@qkrijger sejauh yang saya tahu itu benar. Mengapa khawatir tentang "pencampuran" LXC? Anda menyadari bahwa buruh pelabuhan dibangun di atas LXC bukan?
Programster
@ joselo Saya tidak mengerti pertanyaan Anda, tetapi saya sarankan Anda membuat posting baru dengan lebih detail? Ada banyak cara untuk memulai proses buruh pelabuhan, seperti dengan bash atau sebagai daemon dengan -d dll.
Programster
@programster ya, saya menyadari bahwa :) Tetap saja, menggunakan LXC langsung dalam kombinasi dengan Docker terasa seperti peretasan. Menyenangkan, tetapi tidak benar-benar dapat dipertahankan. Secara umum, seseorang harus kode di lapisan abstraksi yang satu memilih untuk bekerja masuk. Jika Anda benar-benar membutuhkan LXC sendiri, mungkin sudah waktunya untuk permintaan tarik pada Docker :)
qkrijger
7

Langkah pertama dapatkan id wadah:

docker ps

Ini akan menunjukkan kepada Anda sesuatu seperti

KOMANDA ID GAMBAR PERINTAH NAMA STATUS BUATAN STATUS

1170fe9e9460 localhost: 5000 / python: env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" 26 detik yang lalu Naik 25 detik 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0

1170fe9e9460 adalah id wadah dalam hal ini.

Kedua , masukkan buruh pelabuhan:

docker exec -it [container_id] bash

jadi dalam kasus di atas: docker exec -it 1170fe9e9460 bash

patapouf_ai
sumber
5

Bagaimana dengan menjalankan Layar tmux / GNU di dalam wadah? Tampaknya cara yang lebih lancar untuk mengakses vty sebanyak yang Anda inginkan dengan sederhana:

$ docker attach {container id}
cig0
sumber
Ini adalah solusi yang baik jika Anda tahu bahwa Anda ingin mendapatkan akses ke sebuah wadah (misalnya untuk men-debugnya), tetapi ini tidak akan membantu OP yang menyatakan bahwa mereka ingin melihat-lihat wadah yang ada.
Luca Spiller
1
Masalah saya dengan jawaban ini adalah bahwa orang-orang sudah bertanya tentang penggunaan docker attachdan saya menunjukkan bahwa:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
Programster
Nah, jika wadah sudah berjalan solusi ini tidak akan membantu Anda tetapi jika Anda sebelumnya menjaga meninggalkan multiplexer berjalan Anda tidak akan memerlukan tambahan ttys ... Bahkan sejak saya mulai menggunakan tmux saya menggunakan satu tty dan hanya satu untuk melakukan semua yang saya butuhkan sejak sekali ke tmux saya dapat menelurkan vtys sebanyak yang saya inginkan.
cig0
4

nsenterapakah itu. Namun saya juga perlu memasukkan wadah dengan cara yang sederhana dan nsenter tidak cukup untuk kebutuhan saya. Itu buggy dalam beberapa kesempatan (layar hitam plus -wd flag tidak berfungsi). Selanjutnya saya ingin masuk sebagai pengguna tertentu dan di direktori tertentu.

Saya akhirnya membuat alat sendiri untuk masuk ke wadah. Anda dapat menemukannya di: https://github.com/Pithikos/docker-enter

Penggunaannya semudah

./docker-enter [-u <user>] [-d <directory>] <container ID>
Pithikos
sumber
Baru saja mencoba, sangat keren! Di ubuntu harus menjalankan sudo apt-get build-essential -y gcc docker-enter.c -o docker-enter sudo ./docker-enter <short-container-id> Bagus bahwa saya tidak harus mendapatkan ID lengkap seperti dengan lxc-attach -n Codebase cukup pendek sehingga seseorang dapat memindai keseluruhan dengan cepat untuk mencari sesuatu yang berbahaya.
Programster
Saya membuat ebuild tersedia di gentoo di github.com/steveeJ/personal-portage-overlay sebagai app-emulation / docker-enter.
stefanjunker
Saya telah menambahkan tutorial / skrip untuk otomatis ini untuk pengguna ubuntu di programster.blogspot.co.uk/2014/01/…
Programster
2

Cara "nsinit" adalah:

instal nsinit

git clone [email protected]:dotcloud/docker.git
cd docker
make shell

dari dalam wadah:

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

dari luar:

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

Gunakan

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash
Ivailo Bardarov
sumber
2
docker exec -t -i container_name /bin/bash

Akan membawa Anda ke konsol wadah.

Danstan
sumber
Saya mendapat pertanyaan ini karena saya memiliki masalah yang sama. Jawaban yang tampaknya serupa tidak bekerja untuk saya sampai saya memodifikasi. Saya bisa menghapus ini.
Danstan
2
docker exec -ti 'CONTAINER_NAME' sh

or

docker exec -ti 'CONTAINER_ID' sh
Flavio
sumber
1

Saya mulai menjalankan PowerShell pada menjalankan microsoft / iis dijalankan sebagai daemon menggunakan

docker exec -it <nameOfContainer> powershell
Ahmed Samir
sumber
Sepertinya pertanyaannya adalah tentang wadah berbasis linux. Jawaban ini mungkin hanya akan berfungsi jika Anda memiliki wadah berbasis windows -atau- jika Anda memiliki .NET Core versi PowerShell yang terinstal, misalnya PowerShell 6 atau yang lebih baru.
Manfred
0

Pada Windows 10 , saya memiliki buruh pelabuhan diinstal. Saya menjalankan Jnekins pada sebuah wadah dan saya menemukan pesan kesalahan yang sama. Berikut ini adalah panduan langkah demi langkah untuk mengatasi masalah ini:

Langkah 1: Buka gitbash dan jalankan docker run -p 8080: 8080 -p 50000: 50000 jenkins.

Langkah 2: Buka terminal baru.

Langkah 3: Lakukan "buruh pelabuhan ps" untuk mendapatkan daftar wadah berjalan. Salin id wadah.

Langkah 4: Sekarang jika Anda melakukan "docker exec -it {container id} sh" atau "docker exec -it {container id} bash" Anda akan mendapatkan pesan kesalahan yang mirip dengan "perangkat input bukan TTY. Jika Anda menggunakan mintty, coba awali perintah dengan 'winpty' "

Langkah 5: Jalankan perintah " $ winpty docker exec -it {container id} sh "

vola !! Anda sekarang berada di dalam terminal.

Dev 00721
sumber