Dockerfile build - สามารถละเว้นข้อผิดพลาดได้หรือไม่?


112

ฉันมี Dockerfile เมื่อสร้างอิมเมจบิวด์ล้มเหลวเนื่องจากข้อผิดพลาดนี้:

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

ซึ่งในความเป็นจริงไม่เป็นอันตราย ไลบรารีสร้างได้ดี แต่ Docker หยุดการสร้างเมื่อได้รับข้อผิดพลาดนี้ มีวิธีใดบ้างที่ฉันสามารถสั่งให้ Docker เพิกเฉยต่อสิ่งนี้ได้

คำตอบ:


221

แน่นอน Docker เพิ่งตอบสนองต่อรหัสข้อผิดพลาดที่ส่งคืนโดยRUNเชลล์สคริปต์ในไฟล์Dockerfile. หากคุณDockerfileมีสิ่งที่ต้องการ:

RUN make

คุณสามารถแทนที่ด้วย:

RUN make; exit 0

สิ่งนี้จะส่งคืน0รหัสทางออก (สำเร็จ) เสมอ ข้อเสียที่นี่ก็คือภาพของคุณจะปรากฏในการสร้างที่ประสบความสำเร็จแม้ว่าจะมีมีข้อผิดพลาดเกิดขึ้นจริงในการสร้างกระบวนการ


2
service php7-fpm startผมเคยมาที่นี่เมื่อพยายามที่จะวิ่ง มันจะส่งคืน 1 และ RUN จะล้มเหลว การใช้service php7-fpm start; service php7-fpm statusเคล็ดลับ - ดูเหมือนว่าจะแก้ปัญหาระหว่างการสร้างเช่นกันเนื่องจากคำสั่งทั้งสองที่ทำงานแยกกันจะทำให้เกิดปัญหา
igorsantos07

ฉันมาที่นี่เมื่อพยายามสร้าง Qt5 จากแหล่งที่มา มันจะสร้างได้ดี แต่ใช้การสร้างพร้อมกันรวมกับข้อเท็จจริงที่ว่ากระบวนการสร้าง Qt มีการทดสอบเวลาสร้างที่รันจาก make (ซึ่งโดยเจตนาล้มเหลว) คำสั่ง RUN ของฉันออกโดยมีข้อผิดพลาด (2) หวังว่าจะแก้ปัญหาได้!
Lennart Rolland

34

นี้อาจเป็นที่สนใจของผู้ที่มีข้อผิดพลาดที่อาจเกิดขึ้นในภาพของพวกเขามีพอที่จะไม่เป็นอันตราย ที่จะไปสังเกต / บันทึกการเข้า (นอกจากนี้ตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็นดังนั้นนี่คือคำตอบ)

ตามที่ระบุไว้ข้อเสียRUN make; exit 0คือคุณไม่ได้รับรู้หากการสร้างของคุณล้มเหลว ดังนั้นควรใช้สิ่งที่ชอบ:

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

ด้วยวิธีนี้คุณจะได้รับการแจ้งเตือนผ่านบันทึกกระบวนการสร้างอิมเมจนักเทียบท่าและคุณสามารถดูได้ว่าเกิดอะไรขึ้นในระหว่างmake(หรือการดำเนินการอื่นใดสิ่งนี้ไม่ได้ถูก จำกัด ให้ทำ)


นี่คือคำตอบที่ประเมินต่ำ กรณีการใช้งานของฉันคือรายการแพ็คเกจบางรายการไม่สามารถเข้าถึงได้และapt-get update -yล้มเหลว
Silviu Burcea

16

คุณยังสามารถใช้ข้อผิดพลาดการละเว้นทุบตีมาตรฐาน|| trueซึ่งดีถ้าคุณอยู่ตรงกลางของห่วงโซ่:

RUN <first stage> && <job that might fail> || true && <next stage>

สิ่งที่ฉันต้องการ :) สิ่งที่จะดีไปกว่านั้นคือการล้มเหลวหากงานล้มเหลว แต่หลังจากขั้นตอนต่อไป (การล้างข้อมูล)
csomakk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.