SHELL [“/bin/bash”, “-c”]とは何か

Docker

経緯

Dockerの勉強をする中でSHELL [“/bin/bash”, “-c”]という一文がDockerfileの中に出てきました。

よく意味が分からなかったので調べた範囲でこちらに記載します。

SHELL [“/bin/bash”, “-c”]の意味

SHELL [“/bin/bash”, “-c”]という文は、Dockerfile内で使用されるシェルのデフォルトを指定するために使われます。具体的には、このコマンドによって、以降のRUN命令などで実行されるコマンドが、/bin/bash -c で実行されるようになります。

通常、Dockerfileの中でコマンドを実行する際、デフォルトのシェルは/bin/shです。しかし、SHELLディレクティブを使うことで、/bin/bash(Bash)を使うように変更できます。-cオプションは、Bashシェルにコマンドを引数として渡し、それを実行させるオプションです。

これにより、Dockerfile内でのシェルコマンド実行時に、Bashの機能(例: &&, ||, 環境変数展開など)を利用できるようになります。

/bin/shとは

/bin/bashがBashを示すことが上記の内容からわかりました。そうしたら、/bin/shにはそもそも何が入っていたんだ?という疑問が湧いてきます。

/bin/sh には、システムやディストリビューションによって異なるシェルが入っていますが、一般的には以下のシェルが使われます。現代のLinuxやUnix系システムでは、/bin/sh は特定のシェルへのシンボリックリンク(別名を指すファイルパス)になっていることが多いです。

  1. Dash(Debian Almquist Shell):
    • 多くのLinuxディストリビューション(特にDebian系やUbuntu)では、/bin/sh は Dash シェルへのシンボリックリンクになっています。Dashは非常に軽量で、シンプルなPOSIX準拠のシェルです。システムのブートプロセスやスクリプト実行で効率を重視する場合、Dashが選ばれることが多いです。
  2. Bash(Bourne Again Shell)
    • 一部のシステムでは、/bin/sh が Bash へのリンクになっていることもあります。BashはBourne Shellの後継で、より豊富な機能を備えています。Bashは互換性を持ちながらも、多くの拡張機能を持つため、デフォルトの対話型シェルやスクリプトシェルとしても人気です。
    • Bashが/bin/shとして使われる場合、POSIX準拠のモードで動作します。これは、Bashが本来持つ拡張機能の一部が無効化され、より標準的なシェルとしての役割を果たします。
  3. Bourne Shell(オリジナルのsh)
    • 古いUnixシステムや商用のUnixシステム(Solarisなど)では、/bin/sh がオリジナルのBourne Shell(shとも呼ばれる)そのものになっている場合もあります。これは1970年代に開発されたシェルで、非常にシンプルで、POSIX標準の元となったシェルです。現在では多くのシステムで直接は使われていませんが、互換性のためにサポートされることがあります。

まとめ

ここまでをまとめると

SHELL [“/bin/bash”, “-c”]は/bin/shに入っているデフォルトのシェルからBashに切り替えるという意味。

/bin/shにはディストリビューションによるが、DashやBash、Bourne Shellが入っている。

/bin/shにBashが入っているかもしれないが、それは機能が制限されている。

だから、SHELL [“/bin/bash”, “-c”]を書いて、高機能なBashを使おうという意味が込められている。

コメント

タイトルとURLをコピーしました