Bagaimana Saya bisa men-debug inisialisasi kontainer docker?

Saya memiliki masalah dengan wadah, meskipun dibangun dengan sempurna, itu tidak dimulai dengan benar. Penyebabnya adalah solusi yang telah saya tambahkan ke Dockerfile (karena memiliki perutean /etc/hosts yang dikonfigurasi sendiri)

RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-overrideADD hosts.template /etc-override/hostsRUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2ENV LD_LIBRARY_PATH /lib-override

Jelas ada beberapa kesalahan di sana, tetapi saya bertanya-tanya bagaimana saya bisa mendapatkan info lebih lanjut tentang apa yang dilakukan docker saat menjalankan. misalnya, ini berfungsi:

$ docker run image lsusr bin ...

Tapi ini tidak:

$ docker run image ls -l$

Tidak ada apa-apa di log dan saya juga tidak bisa memanggil shell interaktif. Saya dapat menggunakan strace untuk melihat apa yang terjadi tetapi saya berharap ada cara yang lebih baik.

Apakah ada cara saya dapat Mengatur docker menjadi lebih verbose?

EDIT: Terima kasih kepada Andrew D. saya sekarang tahu apa yang salah dengan kode di atas (saya meninggalkannya sehingga jawabannya dapat dipahami). Sekarang masalahnya masih Bagaimana Saya bisa men-debug sesuatu seperti ini atau mendapatkan beberapa alasan mengapa ls-l gagal mengapa ls tidak.

EDIT: The-D = true mungkin memberikan lebih banyak output, meskipun tidak dalam kasus saya...

Docker events perintah dapat membantu dan Docker logs perintah dapat mengambil log bahkan setelah gambar gagal untuk memulai.

Pertama mulai docker events di latar belakang untuk melihat apa yang terjadi.

docker events&

Kemudian jalankan kegagalan Anda docker run ... perintah. Maka Anda akan melihat sesuatu seperti berikut di layar:

2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die

Kemudian anda bisa mendapatkan ID hex startup dari pesan sebelumnya atau output dari perintah run. Kemudian Anda dapat menggunakannya dengan perintah log:

docker logs <copy the instance id from docker events messages on screen>

Anda sekarang akan melihat beberapa output dari startup gambar yang gagal.

Seperti yang disarankan @ alexkb dalam komentar: docker events& dapat merepotkan jika penampung Anda terus-menerus dimulai ulang dari sesuatu seperti layanan AWS ECS. Dalam skenario ini mungkin lebih mudah untuk mendapatkan wadah hex id dari log di /var/log/ecs/ecs-agent.log.<DATE>. Kemudian gunakan docker logs <hex id>.

Nah yang terbaik yang saya telah menemukan sejauh ini adalah:

#stop the current demon and start it in debug modussudo service docker stopdockerd -D # --debug

Hanya mulai klien dari shell baru. Kesalahpahaman adalah untuk berpikir klien benar-benar melakukan apa-apa... Yah itu hanya berkomunikasi dengan daemon, sehingga Anda tidak ingin debug klien tetapi daemon itu sendiri (biasanya).

Dalam kasus saya -a (lampirkan ke stdout/STDERR) bendera sudah cukup:

user@machine:~$ docker start -a server_nameError: The directory named as part of the path /log/log_path/app.log does not exist.For help, use /usr/bin/supervisord -h

Ini menunjukkan kesalahan startup (dalam kasus kami, jalur log yang hilang digunakan oleh supervisord). Saya berasumsi sebagian besar kesalahan startup kontainer akan muncul di sini juga.

Saya tidak dapat menjawab pertanyaan Anda tentang cara membuat output buruh pelabuhan lebih lengkap tetapi saya dapat memberi tahu Anda bahwa regex di tempat mengganti string dalam file .so agak gila: string hanya memiliki begitu banyak ruang yang dialokasikan untuk itu, dan jika Anda mengubah offset file dari entri lain, file elf menjadi rusak. Coba jalankan objdump atau readelf pada file. so Anda setelah menjalankan perintah perl (sebelum LD_LIBRARY_PATH berubah) di luar wadah-dolar untuk donat sekarang korup.

Alasan kerjanya dalam Hack sedih diperlukan adalah karena" tmp "dan" etc " adalah panjang string yang sama sehingga tidak ada perubahan offset. Pertimbangkan direktori / dkr atau serupa jika Anda memilih untuk tidak menggunakan /tmp.

Jika Anda harus mengambil pendekatan ini dan jalur yang Anda inginkan tidak dapat diubah, bangun kembali pustaka dan ubah jalur default untuk /etc/hosts di sumbernya. Atau lebih baik, saat membangun modifikasi Anda libnss_files.so ganti namanya menjadi sesuatu seperti libnss_altfiles.so dan perubahan nsswitch.conf untuk menggunakan hosts: altfiles saat memulai wadah docker Anda (kecuali docker memiliki bind mounted nsswitch.conf juga, maka Anda tidak dapat mengubahnya). Ini akan membiarkan Anda memiliki libnss_altfiles.so sejalan dengan perpustakaan normal Anda dalam sistem dasar. Jika docker tidak mengikat-mount nsswitch.conf, meninggalkan salinan dibangun kembali Anda libnss_files.so di direktori / lib-override Anda siap dimuat oleh LD_LIBRARY_PATH.

Sebagai peringatan, binari suid / sgid mengabaikan LD_LIBRARY_PATH dan LD_PRELOAD, jadi beberapa hal akan rusak (baca: kembali menggunakan default /etc/hosts) jika Anda menggunakan variabel tersebut.

Terkadang, Anda dapat menemukan pesan kesalahan yang berguna dengan sshing ke node yang menjalankan daemon docker dan kemudian melakukan:

$ tail -f /var/log/containers/* /var/log/docker.log 2>&1

Pada 'Docker Community edition' di Mac OS, Anda dapat terhubung ke docker vm dengan melakukan:

$  screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

Silakan membuat upaya untuk menandai salah satu jawaban sebagai “diterima”, terima kasih!