Saya secara naif mengharapkan perintah ini untuk menjalankan bash shell dalam wadah yang sedang berjalan:
docker run "id of running container" /bin/bash
sepertinya itu tidak mungkin, saya mendapatkan kesalahan:
2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Jadi, jika saya ingin menjalankan bash shell dalam wadah yang sedang berjalan (mis. Untuk tujuan diagnosis)
apakah saya harus menjalankan server SSH di dalamnya dan masuk melalui ssh?
docker run CONTAINER
direncanakan pada 1.0docker attach container_name
Jawaban:
EDIT: Sekarang Anda dapat menggunakan
docker exec -it "id of running container" bash
( doc )Sebelumnya, jawaban untuk pertanyaan ini adalah:
Jika Anda benar-benar harus dan Anda berada dalam lingkungan debug, Anda dapat melakukan ini:
sudo lxc-attach -n <ID>
Perhatikan bahwa id harus penuh (docker ps -notrunc
).Namun, saya sangat merekomendasikan ini.
pemberitahuan:
-notrunc
sudah usang, itu akan segera diganti--no-trunc
.sumber
lxc-attach
seharusnya berfungsi dengan baik. Saya hanya dua kali lipat diperiksa dan berfungsi untuk saya. (Perhatikan bahwa ini tidak akan berfungsi dengan kernel 3.8 sebelumnya).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) menjalankan wadah lain untuk melihat konten data volume:docker run -volumes-from somename -i -t busybox /bin/sh
.Dengan docker 1.3, ada perintah baru
docker exec
. Ini memungkinkan Anda untuk memasuki buruh pelabuhan:sumber
docker ps
untuk mendapatkan id menjalankan instancedocker inspect <image>
untuk melihat cangkang apa yang tersedia. Misalnya laridocker exec -it <container id> /bin/sh
saja.Kerjakan saja
Seperti yang disebutkan dalam komentar, untuk melepaskan dari wadah tanpa menghentikannya, ketikkan Ctrlpkemudian Ctrlq.
sumber
docker attach container_name
gunakanctrl p
danctrl q
bukannyaexit
.exit
perintah menghentikan wadah, di manactrlp
danctrl q
hanya melepaskan wadah itu dan tetap berjalanKarena banyak hal yang menyakitkan, saat ini cara yang disarankan untuk mengakses wadah yang sedang berjalan adalah menggunakan
nsenter
.Anda dapat menemukan informasi lebih lanjut tentang repositori github ini . Tetapi secara umum Anda dapat menggunakan nsenter seperti ini:
atau Anda dapat menggunakan pembungkus
docker-enter
:Penjelasan yang bagus tentang topik ini dapat ditemukan di entri blog Jérôme Petazzoni: Mengapa Anda tidak perlu menjalankan sshd di wadah buruh pelabuhan Anda
sumber
source /proc/*/environ
.Hal pertama yang tidak bisa Anda jalankan
Karena perintah ini mengharapkan gambar dan bukan wadah dan itu akan tetap menghasilkan wadah baru (jadi bukan yang Anda ingin lihat)
Saya setuju dengan fakta bahwa dengan buruh pelabuhan kita harus mendorong diri kita sendiri untuk berpikir dengan cara yang berbeda (jadi Anda harus menemukan cara agar Anda tidak perlu masuk ke dalam wadah), tetapi saya masih menganggapnya berguna dan ini adalah cara saya bekerja di sekitarnya.
Saya menjalankan perintah saya melalui penyelia dalam mode DEAMON.
Lalu saya melakukan apa yang saya sebut
docker_loop.sh
Konten cukup banyak ini:Apa yang dilakukannya adalah memungkinkan Anda untuk "melampirkan" ke wadah dan disajikan dengan
supervisorctl
antarmuka untuk menghentikan / memulai / memulai kembali dan memeriksa log. Jika itu tidak cukup, Anda dapatCtrl+D
dan Anda akan jatuh ke dalam shell yang akan memungkinkan Anda untuk mengintip seolah-olah itu adalah sistem normal.HARAP JUGA MENGAMBIL KE ACCOUNT bahwa sistem ini tidak seaman memiliki wadah tanpa cangkang, jadi ambil semua langkah yang diperlukan untuk mengamankan wadah Anda.
sumber
Mengawasi permintaan penarikan ini: https://github.com/docker/docker/pull/7409
Yang mengimplementasikan yang akan datang
docker exec <container_id> <command>
utilitas yang . Ketika ini tersedia, seharusnya dimungkinkan untuk memulai dan menghentikan layanan ssh di dalam wadah yang sedang berjalan.Ada juga yang
nsinit
harus dilakukan ini: "nsinit menyediakan cara praktis untuk mengakses shell di dalam namespace yang dijalankan penampung" , tetapi tampaknya sulit untuk dijalankan. https://gist.github.com/ubergarm/ed42ebbea293350c30a6sumber
docker exec
mendarat di Docker 1.3, jadi sekarang mungkin untuk membuat dan bergabung dengan sesi shell baru dalam wadah yang sedang berjalanKamu bisa menggunakan
sumber
Sebenarnya ada cara untuk memiliki shell di wadah.
Anggaplah Anda
/root/run.sh
meluncurkan proses, manajer proses (penyelia), atau apa pun.Buat
/root/runme.sh
dengan beberapa trik layar gnu:Sekarang, Anda memiliki daemon di tab 0, dan shell interaktif di tab 1.
docker attach
kapan saja untuk melihat apa yang terjadi di dalam wadah.Saran lain adalah membuat gambar "bundel pengembangan" di atas gambar produksi dengan semua alat yang diperlukan, termasuk trik layar ini.
sumber
ini solusinya
bagian dari DOckerfile:
bagian dari "initd.sh"
setelah gambar dibangun, Anda memiliki dua opsi menggunakan exec dan melampirkan:
docker run --name $ CONTAINER_NAME -dt $ IMAGE_NAME
kemudian
docker exec -itu $ CONTAINER_NAME / bin / bash
dan gunakan
CTRL + D untuk melepaskan
docker run --name $ CONTAINER_NAME -dit $ IMAGE_NAME
kemudian
buruh pelabuhan melampirkan $ CONTAINER_NAME
dan gunakan
CTRL + P dan CTRL + Q untuk melepaskan
perbedaan antara opsi ada di parameter -i
sumber
Ada dua cara.
Dengan melampirkan
Dengan exec
sumber
Jika tujuannya adalah untuk memeriksa log aplikasi, pos ini menunjukkan memulai tomcat dan tailing log sebagai bagian dari CMD. Log kucing jantan tersedia di host menggunakan 'docker logs containerid'.
http://blog.trifork.com/2013/08/15/using-docker-to-efisienly-create-multiple-tomcat-instances/
sumber
Ini berguna memberi nama saat menjalankan wadah. Anda tidak perlu merujuk container_id.
docker run --name container_name yourimage docker exec -it container_name bash
sumber
pertama, dapatkan id wadah dari wadah yang diinginkan oleh
Anda akan mendapatkan sesuatu seperti ini:
sekarang salin id wadah ini dan jalankan perintah berikut:
sumber
Mungkin Anda menyesatkan seperti saya untuk berpikir dalam hal VM ketika mengembangkan wadah. Saran saya: Cobalah untuk tidak melakukannya.
Kontainer sama seperti proses lainnya. Memang Anda mungkin ingin "melampirkan" padanya untuk keperluan debugging (pikirkan / proc // env atau strace -p) tetapi itu adalah kasus yang sangat khusus.
Biasanya Anda hanya "menjalankan" prosesnya, jadi jika Anda ingin mengubah konfigurasi atau membaca log, cukup buat wadah baru dan pastikan Anda menulis log di luarnya dengan membagikan direktori, menulis ke stdout (jadi buruh pelabuhan bekerja) atau semacam itu.
Untuk keperluan debugging Anda mungkin ingin memulai sebuah shell, lalu kode Anda, lalu tekan CTRL-p + CTRL-q untuk membiarkan shell tetap utuh. Dengan cara ini Anda dapat memasang kembali menggunakan:
Jika Anda ingin men-debug wadah karena melakukan sesuatu yang tidak Anda harapkan, coba debug itu: /server/596994/how-can-i-debug-a-docker-container - inisialisasi
sumber
Tidak, ini tidak mungkin. Gunakan sesuatu seperti
supervisord
untuk mendapatkan server ssh jika itu diperlukan. Meskipun, saya pasti mempertanyakan kebutuhan.sumber