Dockerfileでの|(パイプ)の扱い


hadolint DL4006について

Set the SHELL option -o pipefail before RUN with a pipe in

DockerfileのRUN命令の前に、SHELL命令で、-o pipefailを指定しておくべしというもの

なぜつけた方がいいのか?

example(ダメな例)
RUN wget -O - https://some.site | wc -l > /number

上の例では、wc -lコマンドが成功している限り、wgetコマンドが失敗しても、このビルドステップは成功して新しいイメージを生成します。

そこでSHELL命令の出番

example(良い例)
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN wget -O - https://some.site | wc -l > /number

bash -o pipefail / set -o pipefail

パイプでつないだ各コマンドの中で終了ステータスが0以外(正常終了以外)だった場合に、最後に0以外だったコマンドの終了ステータスが返されます。

すなわちwgetコマンドが失敗した場合に、ビルドが成功しないようになるということです