DockerfileのSHELLについての説明メモ

概要

  • DockerfileのSHELL構文について理解がなかったので、調査時のメモ

出発点

こちらのページで出てきたDockerfileの調査をしていた

qiita.com

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

参考

こちらのサイトが非常に参考になりました。ありがとうございます。

https://gist.github.com/mohanpedala/1e2ff5661761d3abd0385e8223e16425

qiita.com

SHELL命令

docs.docker.jp

SHELL 命令は、 シェル 形式で使われるデフォルトのコマンドを上書きできます。 Linux 上でのデフォルトのシェルは ["/bin/sh", "-c"] で、Windows は ["cmd", "/S", "/C"] です。Dockerfile では、 SHELL 命令を JSON 形式で書く必要があります。

  • SHELLという構文はDockerfile内で使用される(Dockerfileビルド時に使用される)コマンドラインに対して、上書きができる
  • デフォルトではDockerは["/bin/sh", "-c"]の設定になっている

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

  • 意味を紐解く(これはDockerの話ではなく、bashの話)
    • "/bin/bash"
      • これはこのまま"/bin/bash"を使うという意味
    • "-oeux"
      • -e
        • エラーが発生したらシェルの実行を停止してくれる(つまり、Dockerのビルドが止まる)
      • -u
        • 未定義の変数を使用した場合にエラーとする
      • -x
        • 実行したコマンドをターミナルに出力する
      • -o pipefail
        • -eオプションを設定していたとしても、パイプでつないだ際には止まってくれないが、-o pipefailというオプションを付けることによりとまるようになる(以下、具体例)
#!/bin/bash -e

false | true
echo do not stop

# 上記場合にはecho do not stopは実行される

#!/bin/bash -e

set -o pipefail

false | true
echo do not stop
# 上記場合にはecho do not stopは実行されない