talesleaves-dev

諸々の開発のメモ。画像は面倒

使用している環境からVagrantのBoxを作成する

現在の環境を保存したい!

ある程度環境内での作業が進んでくると、毎回いちから環境を作り直すのではなく、現在の環境を保存しておきたくなります。
この時に方法はいくつかあるのですが、ここではローカルにBoxファイルを作成してベースBoxにする方法を紹介します。

前提条件

その他条件はありません。


その他の選択肢
このほかの環境を保存する方法としては、HashiCorpのPackerとVagrant Cloudを利用したり、VMのマシンそのものをバックアップしておく方法などが考えられます。
Vagrant Cloudの機能はまだ限定的で、Packerを利用しないと自動ではBoxをアップロードすることが出来ません。この記事の手順で生成されたBoxを手動でアップロード、バージョン管理する手順が公式のドキュメントに記載されていますが、現時点では試しておりません。

Boxの作成コマンド

vagrant package

実のところ、Boxの作成には保存したいプロジェクトのフォルダで"vagrant package"を実行するだけです。
vagrant package --base VM_NAME”を実行します。
ベースボックスとして作成するオプションを指定し、作成するboxの元になる環境のマシン名を指定します。


10月6日追記:"vagrant package"だけではだめです!
大変申し訳ございませんでした。
vagrant package --base VM_NAME”が正しいです。
この手順でないと作成された.boxファイルをベースにした仮想マシンではsshログインできない環境が作られてしまいます。
6時間ほどハマりました。

生成されるファイル名の指定や同梱するファイルの指定などのオプションがありますが、とりあえず上記だけでも再利用可能な現在の環境を保存した.boxファイルが作成されます。
デフォルトでは、"package.box"というファイル名で生成されます。


"vagrant box repackage"ではありません
"vagrant box repackage"は現在のVagrantにaddされているBoxを.boxファイルに戻すコマンドです。
ベースBoxはほとんどがVagrant cloudのカタログからダウンロードされているかと思いますので、特殊な条件以外ではこのコマンドを使うことはないと思います。


Boxの内容
.boxファイルの実体はVMのバックアップデータ、Vagrantファイル、Boxのメタ情報を記述したjsonファイルのアーカイブです。圧縮形式は.tar.gzとなっています。
.vagrant.dフォルダの中にはaddされたBoxが展開された状態で入っていることが確認できますが、同梱のファイルにも特に変わった情報はありませんでした。

別の仮想環境で利用する

VagrantにBoxを追加する

ローカル環境で作成したBoxを再利用するには、VagrantにこのBoxを追加します。

vagrant box add --name BOX_NAME PATH_TO_BOX_FILE

PATH_TO_BOX_FILEはpackageをデフォルトで実行し、フォルダを移動していなければ"./package.box"です。
BOX_NAMEは既存のBoxとと重複をさけて、わかりやすいものを付けましょう。ここでバージョニングをしておく方が良いかと思います。
Vagrant cloudで利用されているようなバージョン管理は、ローカル環境では行うことが出来ません。


--box-version VERSION
"--box-version VERSION"のオプションはクラウド上からBoxをダウンロードするときのバージョンを指定するもので、追加するBoxに対してバージョニングを行うものではありませんので注意してください。
残念ながら、ローカルの.boxファイルから追加されたBoxは常にバージョン0として認識されます。

別の仮想環境のベースにする

これも特に工夫は必要ありません。
"vagrant init"の際にaddしたときに指定したBox名を指定するか、Vagrntfile内で下記のように記述するだけです。

  config.vm.box = "BOX_NAME"

upを行うと、Vagrantに追加されたBoxをベースにしてマシンが構築され、起動時間が大幅に短縮できます。
特に多くのアプリケーションをダウンロードしてインストールしている場合などには効果が大きいですのでお試しください。

軽量化と参考記事

Boxの大きさは仮想マシン内のデータ量に依存します。
また、配布を前提にBoxを作成するのであれば、操作履歴等は削除しておいた方が良いと思われます。
これらを含め、この記事の内容については下記の記事が非常に参考になりました。
qiita.com