経緯
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 は特定のシェルへのシンボリックリンク(別名を指すファイルパス)になっていることが多いです。
- Dash(Debian Almquist Shell):
- 多くのLinuxディストリビューション(特にDebian系やUbuntu)では、/bin/sh は Dash シェルへのシンボリックリンクになっています。Dashは非常に軽量で、シンプルなPOSIX準拠のシェルです。システムのブートプロセスやスクリプト実行で効率を重視する場合、Dashが選ばれることが多いです。
- Bash(Bourne Again Shell):
- 一部のシステムでは、/bin/sh が Bash へのリンクになっていることもあります。BashはBourne Shellの後継で、より豊富な機能を備えています。Bashは互換性を持ちながらも、多くの拡張機能を持つため、デフォルトの対話型シェルやスクリプトシェルとしても人気です。
- Bashが/bin/shとして使われる場合、POSIX準拠のモードで動作します。これは、Bashが本来持つ拡張機能の一部が無効化され、より標準的なシェルとしての役割を果たします。
- 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を使おうという意味が込められている。
コメント