Bagaimana cara menyelidiki proses utama yang telah mati dalam wadah buruh pelabuhan?

13

Kadang-kadang Anda harus menyelidiki wadah, yang dihentikan, atau wadah yang setelah memulai mati sangat cepat dan berhenti.

docker exec -ti <id> bash hanya berfungsi pada menjalankan kontainer, setelah selesai, bash prompt juga berakhir.

Dengan docker startAnda tidak dapat memberikan perintah yang berbeda, dan jika wadah mati mendadak lagi, Anda tidak akan punya cukup waktu untuk masuk ke dalam wadah dan melakukan penyelidikan.

Kita bisa melakukannya docker commit, kemudian docker runpada gambar baru dengan perintah yang berbeda, tetapi saya bertanya-tanya apakah ada alternatif lain.

Catatan : docker logshanya mengembalikan apa pun yang dicetak aplikasi ke stdout / stderr. Itu mungkin tidak cukup untuk mencari tahu apa masalahnya.

SztupY
sumber
Setelah beberapa saat memikirkannya: Proses utama Docker ???? Sebagai wadah yang bertujuan menjalankan hanya satu proses, istilah 'utama' harus dihapus, atau Anda melakukan sesuatu yang aneh (seperti menjalankan proses init), atau Anda mengambil utas sebagai proses ... Saya menganggap itu opsi satu, tetapi saya harus mengatakannya karena itu mengganggu saya
Tensibai
@Tensibai kadang-kadang Anda harus menjalankan sesuatu seperti dumb-init, untuk menangani masalah pens 1 / signaling dalam wadah, jika perintah utama Anda tidak bisa mengatasinya sendiri. Mungkin juga ada kasus-kasus lain di mana sebuah kontainer buruh pelabuhan menjalankan lebih dari satu proses
SztupY
Ya, itulah yang saya sebut aneh, terutama karena wadah telah dibuat untuk mengisolasi suatu proses. Kadang-kadang wadah bukan solusi untuk aplikasi yang bersedia untuk meletakkan segala sesuatu di dalam wadah lebih merupakan jalan menuju sakit kepala daripada yang lain.
Tensibai

Jawaban:

9

Cara umum untuk melacak mengapa proses di Linux gagal adalah baik. Salah satu cara tersebut adalah menjalankan proses menggunakan straceyang akan memberi tahu Anda proses panggilan sistem dilakukan dan biasanya menunjukkan alasan kegagalan.

Anda dapat membuat sesuatu Dockerfileyang terlihat seperti ini:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

Kemudian jalankan gambar baru Anda menggunakan docker run debug_version strace original_cmd.

Untuk proses yang bercabang anak-anak (dan kemudian mati) Anda ingin menjalankan stracedengan -ffopsi. Anda juga dapat memetakan beberapa file menggunakan volume data Docker dan menggunakan -oopsi dari straceuntuk menulisnya. Tetapi secara umum straceakan meninggalkan output pada stdout, yang dapat dibaca menggunakan docker log.

T terkait : Proses Linux berakhir secara misterius

Evgeny
sumber
Ini berarti saya masih harus docker commitmenghentikan dulu wadah saya untuk memiliki gambar untuk memulai
SztupY
Anda bilang itu mati di awal. Saya berasumsi Anda memiliki gambar. Bagi yang berhenti, ya diperlukan komit.
Evgeny
Itu hanya salah satu skenario untuk mendapatkan wadah yang dihentikan
SztupY
Ada juga paket untuk stracedi Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Gunakan manajer paket Alpine untuk menginstalnya apk install strace,.
Evgeny
3

Sejauh yang saya ketahui, commitdan runmerupakan pilihan terbaik di sini untuk memberi Anda akses penuh ke wadah seperti ketika itu meninggal.

Idealnya, wadah Anda akan memuntahkan beberapa informasi yang lebih berguna ketika gagal, tetapi itu adalah topik yang sama sekali berbeda.

Sunting: untuk memperluas jawaban saya, jika wadah sekarat tepat di awal, Anda juga dapat menggunakan docker rununtuk menentukan alternatif --entrypointdan CMD. Secara umum saya akan mengatur ini ke loop atau sesuatu yang tidak akan keluar dengan sendirinya. Setelah Anda berada di dalam wadah, Anda dapat secara manual menjalankan langkah-langkah yang gagal, dan kemudian memeriksa hasilnya tanpa harus khawatir tentang wadah yang keluar.

tayworm
sumber