

Vagrant環境を作り直すワンライナー(halt && destroy -f && up)
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
vagrant環境を作り直したいとき用のワンライナー。
$ vagrant halt && vagrant destroy -f && vagrant upvagrant halt でVMを停止、vagrant destroy -f でVMを削除、vagrant up で作り直す。3コマンドを繋げて実行するだけ。
destroy は単体だと「本当に削除する?」の確認プロンプトが出るが、-f(--force)を付けると確認なしで即削除される。ワンライナーで流す前提なら -f は必須。
用途としては、Vagrantfileやprovisioningスクリプトをいじった後に「クリーンな状態から作り直して確認したい」ときに使う。vagrant reload --provision でも設定変更は反映できるが、VM自体を作り直したい(ディスクの状態も含めてリセットしたい)場合はこっちの方が確実。
普段使いなら shell の alias や関数にしておくと打つ手間が減る。
haltを挟む理由
vagrant destroy -f だけでも動くには動く(destroy側で起動中のVMも止めて削除してくれる)。それでもhaltを先に挟んでいるのは、VirtualBoxなどのプロバイダ側でVMが起動したまま削除処理に入ると、ゲストOS側のシャットダウン処理をすっ飛ばして強制停止になるケース(ネットワークインターフェースの解放が中途半端になる、など)があるため。数百msの差だが、明示的に落としてから消す方が安全という認識。
destroyで消えるもの・消えないもの
- 消える: VM本体(ディスクイメージ含む)、
.vagrantディレクトリ配下のVM固有情報 - 消えない: ダウンロード済みのbox(
vagrant box listに出てくるもの)、Vagrantfile自体
なのでbaseのOSイメージから作り直すわけではなく、あくまで「そのVagrantfileから生成されたVMインスタンス」をリセットするだけ。box自体を更新したい場合は別途 vagrant box update が必要。
地味に時間がかかる
up の中身次第だが、provisioningスクリプトが重い(パッケージインストールが多いなど)と、このワンライナー全体で数分かかることもある。synced folder(NFS等)を使っている場合は、up時にマウント周りの処理も入るので、頻繁に打つコマンドとしては地味にコストがある。頻度が高いなら、provisioningをidempotentに書いておいて vagrant reload --provision で済ませられないか検討した方がいい場面もありそう。