シェルコマンドの & と && の違いでDocker再起動でハマったメモ

シェルコマンドの & と && の違いでDocker再起動でハマったメモ

シェルコマンドの & と && の違いでDocker再起動でハマったメモです。

背景

最近 Docker を扱うことが多くなってきていて restart でなくて明示的な停止からの起動を行うことがあります。npm stop には Docker の停止、npm start には Docker の起動を入れてます。

npm stop & npm start

これです。

これなんですが、なんかたまに起動せずいきなり即終了しているように見える挙動を目にすることがありました。結構シンプルなコンテナなのに。

Claude Code でコンテナの停止・起動をさっきのコマンドでお願いするときも、

再起動プロセスが完了しましたが、コンテナが最後に停止されています。再度起動します。

といった流れになっていることも見かけました。

解決策は && を使う

自分も調べつつ、これかな?って思うことを投げかけたら Claude Code が原因を特定してくれました。

つまり & を使っていたため npm stop と npm start が並行実行されていたのが問題でした。

npm stop && npm start

&& に変更することで、停止が完了してから起動する順次実行になり、正常に再起動できました~。

ふりかえり

私のように npm scripts の中身で行う Docker コマンドの場合、コンテナの起動・終了は通常のプロセスよりちょっと時間がかかるので & による並行実行の影響がより強く出ていたこともあるようです。たしかに素の docker コマンドだとサクッとうまくいったりで挙動が違うなと思ったのはそういうことだったんですね~。勉強になる。

あと、Claude Code は私の & なコマンド提示を律儀に実行してもらいつつ、再度丁寧に起動してくれてたと思うと、だいぶ健気だなと思いました。そして、おかしいね?と聞くと、ちゃんと答えてくれてありがたや。