Сборка Dockerfile - можно ли игнорировать ошибку?

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 останавливает сборку, как только получает эту ошибку. Есть ли способ заставить Докера игнорировать это?

Оскар
источник

Ответы:

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). Надеюсь, это решит проблему!
Леннарт Роллан
34

Это может быть интересно тем, чьи потенциальные ошибки в изображениях недостаточно безобидны, чтобы остаться незамеченными / зарегистрированными . (Кроме того, недостаточно комментариев для комментариев, поэтому здесь в качестве ответа.)

Как уже отмечалось, недостатком RUN make; exit 0является то, что вы не узнаете, не удалось ли ваша сборка. Следовательно, лучше использовать что-то вроде:

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

Таким образом, вы получаете уведомление через журнал процесса сборки образа докера, и вы можете видеть, что именно пошло не так во время make(или при любом другом выполнении, это не ограничивается созданием).

мес
источник
Это очень недооцененный ответ. В моем случае некоторые списки пакетов были недоступны и терпели apt-get update -yнеудачу.
Сильвиу Бурча,
16

Вы также можете использовать стандартную ошибку игнорирования bash || true, что хорошо, если вы находитесь в середине цепочки:

RUN <first stage> && <job that might fail> || true && <next stage>
MortenB
источник
как раз то, что мне было нужно :) что было бы еще лучше, если задание не удалось, но после следующего этапа (очистки)
csomakk