Dockerfile build - mungkin mengabaikan kesalahan?

112

Saya punya Dockerfile. Saat membuat image, build gagal karena kesalahan ini:

automake: error: no 'Makefile.am' found for any configure output
Error build: The command [/bin/sh -c aclocal && autoconf && automake -a] returned a non-zero code: 1

yang pada kenyataannya tidak berbahaya. Pustaka dibangun dengan baik, tetapi Docker menghentikan pembangunan setelah menerima kesalahan ini. Apakah ada cara agar saya dapat menginstruksikan Docker untuk mengabaikan ini?

Oskar
sumber

Jawaban:

220

Tentu. Docker hanya menanggapi kode kesalahan yang dikembalikan oleh RUNskrip shell di file Dockerfile. Jika Anda Dockerfilememiliki sesuatu seperti:

RUN make

Anda bisa menggantinya dengan:

RUN make; exit 0

Ini akan selalu mengembalikan 0kode keluar (berhasil). Kerugian di sini adalah bahwa gambar Anda akan muncul untuk membangun berhasil bahkan jika ada yang kesalahan yang sebenarnya dalam proses membangun.

larsks
sumber
2
Saya datang ke sini saat mencoba lari service php7-fpm start. Ini akan mengembalikan 1 dan RUN akan gagal; menggunakan service php7-fpm start; service php7-fpm statusmelakukan trik - tampaknya juga menyelesaikan masalah selama pembuatan, karena kedua perintah yang berjalan terpisah akan memberikan masalah.
igorsantos07
Saya datang ke sini saat mencoba membangun Qt5 dari sumber. Itu akan baik-baik saja, tetapi menggunakan build bersamaan yang dikombinasikan dengan fakta bahwa proses build Qt memiliki pengujian waktu build yang dijalankan dari make (yang sengaja gagal) perintah RUN saya keluar dengan error (2). Ini semoga akan menyelesaikan masalah!
Lennart Rolland
33

Ini mungkin menarik bagi mereka, yang potensi kesalahannya dalam gambar mereka tidak cukup berbahaya untuk tidak diketahui / dicatat . (Juga, tidak cukup perwakilan untuk berkomentar, jadi di sini sebagai jawaban.)

Seperti yang telah disebutkan, kerugiannya RUN make; exit 0adalah Anda tidak tahu, jika build Anda gagal. Karenanya, lebih baik gunakan sesuatu seperti:

make test 2>&1 > /where/ever/make.log || echo "There were failing tests!"

Seperti ini, Anda mendapatkan pemberitahuan melalui log proses pembuatan gambar buruh pelabuhan, dan Anda dapat melihat apa yang sebenarnya menjadi buruk selama make(atau apa pun eksekusi, ini tidak dibatasi untuk dibuat).

bln
sumber
Ini adalah jawaban yang diremehkan. Kasus penggunaan saya adalah beberapa daftar paket tidak dapat dijangkau dan apt-get update -ygagal.
Silviu Burcea
14

Anda juga dapat menggunakan kesalahan pengabaian bash standar || true, yang bagus jika Anda berada di tengah rantai:

RUN <first stage> && <job that might fail> || true && <next stage>
MortenB
sumber
hanya apa yang saya butuhkan :) apa yang akan menjadi lebih baik adalah gagal jika pekerjaan gagal, tetapi setelah tahap berikutnya (pembersihan)
csomakk