Docker Composeの run と exec は、どちらも同じような効果が得られる。つまり、コンテナの中に入ったり、コンテナ上でプログラムを実行したりできる。
しかし、もう少し異なった視点で見ると、それぞれ異なる機能を持っているのがわかる。
docker compose runは、新たにイメージからコンテナを作って実行する。この時、--service-ports というオプションをつけておけば、予めdocker-compose.yml や compose.yml で指定したポートをバインドした状態で実行してくれる。
一方、docker compose execは、既に docker compose up で動いているコンテナを使ってコマンドを実行できる。
使い分けとしては、既に docker compose up しているこんてながあれば、exec がおすすめである。run はコンテナ作成のオーバーヘッドがあるので、やや時間がかかる。
runは、他のターミナルと独立して何か実行したいときに便利である。ボリュームをマウントしていない限り、他のコンテナでファイルに加えた変更が連動する事はない。