Saya mencoba membuat gambar Docker baru untuk proses pengembangan kami, menggunakan cpanm
untuk menginstal banyak modul Perl sebagai gambar dasar untuk berbagai proyek.
Saat mengembangkan Dockerfile, cpanm
mengembalikan kode kegagalan karena beberapa modul tidak menginstal dengan bersih.
Saya cukup yakin saya perlu apt
menginstal beberapa hal lagi.
Pertanyaan saya adalah, di mana saya dapat menemukan /.cpanm/work
direktori yang dikutip dalam output, untuk memeriksa log? Dalam kasus umum, bagaimana saya bisa memeriksa sistem file dari docker build
perintah yang gagal ?
Sunting pagi Setelah menggigit peluru dan menjalankan find
saya menemukan
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
Apakah ini dapat diandalkan, atau lebih baik saya membangun wadah "telanjang" dan menjalankan barang secara manual sampai saya memiliki semua hal yang saya butuhkan?
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
itu adalah internal Docker dan saya tidak akan mengacaukannyaJawaban:
Setiap docker berhasil mengeksekusi
RUN
perintah dari Dockerfile, layer baru di sistem file gambar dikomit. Anda bisa menggunakan id layer itu sebagai gambar untuk memulai wadah baru.Ambil Dockerfile berikut:
dan membangunnya:
Anda sekarang dapat memulai wadah baru dari
00f017a8c2a6
,044e1532c690
dan5bd8172529c1
:tentu saja Anda mungkin ingin memulai sebuah shell untuk menjelajahi filesystem dan mencoba perintah:
Ketika salah satu perintah Dockerfile gagal, yang perlu Anda lakukan adalah mencari id dari lapisan sebelumnya dan menjalankan shell di wadah yang dibuat dari id itu:
Sekali dalam wadah:
Jika Anda benar-benar perlu bereksperimen di lapisan aktual yang gagal alih-alih bekerja dari lapisan kerja terakhir, lihat jawaban Drew .
sumber
docker run --rm -it <id_last_working_layer> bash -il
dan sekali dalam wadah coba perintah yang gagal mereproduksi masalah, lalu memperbaiki perintah dan mengujinya, akhirnya perbarui Dockerfile Anda dengan perintah tetap.docker diff <container>
dan mendapatkan daftar menyeluruh dari perubahan sistem file tertentu yang dibuat pada lapisan tertentu (file ditambahkan, dihapus, atau diubah di seluruh sistem file untuk gambar itu).Unable to find image 'd5219f1ffda9:latest' locally
. Namun, saya bingung dengan berbagai jenis ID. Ternyata Anda harus menggunakan ID yang langsung setelah panah, bukan yang mengatakan "Berlari ...".Jawaban teratas berfungsi jika Anda ingin segera memeriksa status sebelum perintah gagal.
Namun, pertanyaannya adalah bagaimana memeriksa kondisi wadah yang gagal itu sendiri. Dalam situasi saya, perintah gagal adalah bangunan yang membutuhkan beberapa jam, jadi memutar ulang sebelum perintah gagal dan menjalankannya lagi membutuhkan waktu lama dan tidak terlalu membantu.
Solusinya di sini adalah menemukan wadah yang gagal:
Komit ke gambar:
Dan kemudian jalankan gambar [jika perlu, jalankan bash]:
Sekarang Anda benar-benar melihat keadaan build pada saat itu gagal, bukan pada saat sebelum menjalankan perintah yang menyebabkan kegagalan.
sumber
DOCKER_BUILDKIT=1
untuk membangunDockerfile
Docker melakukan cache seluruh status sistem file setelah setiap
RUN
baris yang berhasil .Mengetahui bahwa:
RUN
perintah gagal Anda , komentari di Dockerfile (dan jugaRUN
perintah lainnya), kemudian jalankandocker build
dandocker run
kembali.RUN
perintah yang gagal , cukup tambahkan|| true
padanya untuk memaksanya agar berhasil; kemudian lanjutkan seperti di atas (pertahankan setiap dan semuaRUN
perintah selanjutnya dikomentari, jalankandocker build
dandocker run
)Namun, tidak perlu dipusingkan dengan internal Docker atau lapisan ID, dan sebagai bonus Docker secara otomatis meminimalkan jumlah pekerjaan yang perlu dilakukan kembali.
sumber
Kegagalan langkah pembangunan debugging memang sangat menjengkelkan.
Solusi terbaik yang saya temukan adalah memastikan bahwa setiap langkah yang berhasil benar-benar berhasil, dan menambahkan tanda centang setelah yang gagal. Dengan begitu Anda mendapatkan lapisan yang berisi output dari langkah gagal yang dapat Anda periksa.
Dockerfile, dengan contoh setelah
# Run DB2 silent installer
baris:sumber
Yang akan saya lakukan adalah mengomentari Dockerfile di bawah ini dan termasuk baris yang menyinggung. Kemudian Anda dapat menjalankan kontainer dan menjalankan perintah buruh pelabuhan dengan tangan, dan melihat log dengan cara biasa. Misal jika Dockerfile adalah
dan sekarat di bar saya akan lakukan
Kemudian
sumber