シェルを変更したい(SHELL

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

SHELLコマンドで、Dockerfile内のRUNCMDENTRYPOINTコマンドを実行するシェルを変更できます。

デフォルトは、Linuxイメージだと["/bin/sh", "-c"]、Windowsイメージだと["cmd", "/S", "/C"]です。

通常はデフォルトで問題ありませんが、Bashの高度な機能(配列、条件分岐など)が必要な場合や、Windowsコンテナでcmd.exeではなくPowerShellを使いたい場合にSHELLを指定します。

Bashしたい

1FROM ubuntu:22.04
2SHELL ["/bin/bash", "-c"]
3
4RUN apt-get update && \
5    apt-get install -y curl git

デフォルトのshではBashの高度な機能(配列、関数など)が使えません。 Bashが必要な場合はSHELLで明示的に指定します。

PowerShellしたい

1FROM mcr.microsoft.com/windows/servercore:ltsc2022
2SHELL ["powershell", "-Command"]
3
4RUN Write-Host "Using PowerShell"

Windowsコンテナでcmd.exeではなくPowerShellを使いたい場合に指定します。

シェル形式とexec形式

SHELLコマンドが影響するのは、シェル形式で書かれたコマンドのみです。

1# シェル形式(SHELLの影響を受ける)
2RUN echo "test"
3CMD echo "test"
4
5# exec形式(SHELLの影響を受けない)
6RUN ["/bin/echo", "test"]
7CMD ["/bin/echo", "test"]

exec形式を使う場合、SHELLの設定に関わらず直接コマンドを実行します。

リファレンス