один вкладыш для выполнения функции, проверьте состояние выхода и выйдите из 0, если фактический код выхода был 0 или 1 - PullRequest
1 голос
/ 30 марта 2020

Я запускаю программу, где код завершения 0 или 1 указывает на успех. Я запускаю это при создании образа docker, поэтому, если код возврата не равен 0, сборка завершится неудачно. Как я могу захватить код выхода и принудительно установить код выхода 0, если фактический код выхода равен 0 или 1, чтобы изображение docker могло быть правильно построено?

Я пробовал что-то вроде этого, где (выход 1) представляет программу:

((exit 1) && if [ $? == 0 || $? == 1]; then exit 0; else exit 1; fi;)

, но она не работает, код выхода 1 по-прежнему завершается с 1.

Я бы предпочел не делать program || true, если программа действительно по какой-то причине не работает

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Проблема здесь в том, что exit 0 имеет значение truey , в то время как exit 1 имеет значение falsy . Это означает, что правая часть вашего условия выполняется только тогда, когда первая часть истинна (из-за оператора &&).

Если ваша программа завершает работу с кодом 0, у вас нет ничего для делать. Однако вам нужно «преобразовать» код 1 в код 0. И для этого вам нужен оператор ||.

Это должно работать:

((exit 1) || if [ $? = 1 ]; then exit 0; else exit 1; fi)

Несколько тестов для проверки (я изменил значения кода выхода, чтобы лучше понять, что происходит):

$> ((exit 0) || if [ $? = 1 ]; then exit 2; else exit 3; fi); echo $?
0  # the right-part of the condition is ignored
$> ((exit 1) || if [ $? = 1 ]; then exit 2; else exit 3; fi); echo $?
2  # the exit code 1 is "converted" into an exit code 2 (or 0 in your case)
$> ((exit 2) || if [ $? = 1 ]; then exit 2; else exit 3; fi); echo $?
3  # the exit code 2 is "converted" into an exit code 3 (or 1 in your case)
0 голосов
/ 30 марта 2020

Я столкнулся с другой проблемой при реализации этого в моем dockerfile, который я отмечу здесь вместе с решением, которое я использовал, на случай, если кто-то еще столкнется с подобной проблемой и столкнется с этим.

Когда я запускаю это :

RUN (update_blastdb.pl --decompress taxdb || if [ $? == 1 ]; then exit 0; else exit 1; fi;)

Я получаю сообщение об ошибке:

Downloading taxdb.tar.gz... [OK]
Decompressing taxdb.tar.gz ... [OK]
/bin/sh: 1: [: 1: unexpected operator
The command '/bin/sh -c (update_blastdb.pl --decompress taxdb || if [ $? == 1 ]; then exit 0; else exit 1; fi;)' returned a non-zero code: 1

Видимо docker не запускает команды RUN с использованием bash по умолчанию, и вам необходимо добавить SHELL ["/bin/bash", "-c"] заранее, чтобы этот код мог работать правильно. Тогда это работает.

...