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.


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

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.


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.


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


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}

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>

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 git@github.com: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

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

Akan membawa Anda ke konsol wadah.


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

1

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

docker exec -it <nameOfContainer> powershell

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.