やりたいこと
docker-compose.ymlで下記のコマンドを実行したい
composer install --no-interaction
tail -f /dev/null
なぜDockerfileへ記載しないのか
リビルドが増え面倒
composer installはjsonの記載内容によってvendorにインストールされるものが変わる可能性がある
Dockerfileでcomposer installを実行する環境でコンテナ構築を行った場合、jsonを編集したらイメージから作り直しが必要になりとても面倒な為
ローカルディレクトリのマウント時に面倒が起こる
また、ローカルのディレクトリをコンテナにマウントさせている場合下記のようになる
イメージ作成→マウント→ローカルにはvendorディレクトリがない→マウント後、イメージ内にあるvendorが無くなる
※これが原因でどハマりした事あり
参考:
https://teratail.com/questions/203319
docker-compose.ymlへのコマンド記載方法(基本)
command: tail -f /dev/null
ちなみに上記コマンドは、普通にdocker-compose up -dしただけではコンテナのビルドのみで起動はされない(正確にはymlに記載の内容が全て実行終了した後コンテナが停止する)為、ymlに記載の内容が終了後も何かコマンドが実行されている状態ならコンテナが停止しない仕様からtail -fといった動作し続けるコマンドを実行することでコンテナが停止することを防いでいる
参考:
https://teratail.com/questions/280776
docker-compose.ymlへのコマンド記載方法(複数)
command: >
sh -c "
composer install --no-interaction &&
tail -f /dev/null
"
番外編
dockerコンテナに入る時、bashだったりshだったりこの差がよくわかっていなかった為復習
shは、、
man sh
するとDASHというものが出てきた
dashとは、、
Debian Almquist shellの略で、bashよりも高速、らしい。
/bin/shの代替とも記載があったけど、なぜ代替しているのか、等深堀するのに時間がかかりそうなのでまた別の機会で。