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 start
Anda 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 run
pada gambar baru dengan perintah yang berbeda, tetapi saya bertanya-tanya apakah ada alternatif lain.
Catatan : docker logs
hanya mengembalikan apa pun yang dicetak aplikasi ke stdout / stderr. Itu mungkin tidak cukup untuk mencari tahu apa masalahnya.
docker
containers
post-mortem
SztupY
sumber
sumber
Jawaban:
Cara umum untuk melacak mengapa proses di Linux gagal adalah baik. Salah satu cara tersebut adalah menjalankan proses menggunakan
strace
yang akan memberi tahu Anda proses panggilan sistem dilakukan dan biasanya menunjukkan alasan kegagalan.Anda dapat membuat sesuatu
Dockerfile
yang terlihat seperti ini: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
strace
dengan-ff
opsi. Anda juga dapat memetakan beberapa file menggunakan volume data Docker dan menggunakan-o
opsi daristrace
untuk menulisnya. Tetapi secara umumstrace
akan meninggalkan output pada stdout, yang dapat dibaca menggunakandocker log
.T terkait : Proses Linux berakhir secara misterius
sumber
docker commit
menghentikan dulu wadah saya untuk memiliki gambar untuk memulaistrace
di Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Gunakan manajer paket Alpine untuk menginstalnyaapk install strace
,.Sejauh yang saya ketahui,
commit
danrun
merupakan 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 run
untuk menentukan alternatif--entrypoint
danCMD
. 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.sumber