RUNによる既定シェルの変更

Dockerfileの既定シェルはSHELL命令で明示してください。

説明

以降のシェル形式の命令に使う既定シェルを変える場合は、RUNで間接的に変更せず、SHELLを使ってください。RUNは個々のコマンドを実行するための命令であり、既定シェルを選ぶ意図が明確になりません。

シェル実行ファイルのリンクを変えると、それを使う他のスクリプトにも影響し、以降のコマンドの実行環境が分かりにくくなります。Dockerfileの命令で明示すると、保守や確認がしやすくなります。

想定される影響

  • 意図が分かりにくくなり、Dockerfileの保守が難しくなります。
  • ビルド段階ごとにシェルの動作が変わり、エラーにつながる場合があります。
  • ビルドの確認時に誤解や見落としが起こる可能性があります。

対処方法

  • 既定シェルを変える場合は、SHELL ["..."]を使ってください。
  • RUN ln -sf ...などでシェルを間接的に変更しないでください。
  • シェルを変える必要性を確認し、必要な場合だけ明示してください。

例

/bin/bashにBashがインストールされたLinuxイメージの抜粋です。SHELLは以降のシェル形式のRUN、CMD、ENTRYPOINTに適用され、ユーザーのログインシェルは変更しません。

変更前

dockerfile
RUN ln -sfv /bin/bash /bin/sh

変更後

dockerfile
SHELL ["/bin/bash", "-c"]

説明:

  • 変更前: RUNでシェルのリンクを変更し、シェルの選択意図が分かりにくくなります。
  • 変更後: SHELLで、以降のシェル形式の命令に使うシェルを明示します。

参考資料