説明
以降のシェル形式の命令に使う既定シェルを変える場合は、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で、以降のシェル形式の命令に使うシェルを明示します。