ほとラボ

It works!

Vagrant RSync でローカル開発環境を作る際に注意すべきこと

Vagrant でローカル開発環境を作ってたら色々とハマったのでメモ。

Synced Folders

手持ちのマシンにアプリケーションの実行環境を用意したいとき、Vagrantを使うのはよくあると思います。 ただ、ゲストOSに ssh して開発しようとするとクリップボード共有の設定とかがかなり面倒です。

そういうときは VagrantSynced Folders 機能を使います。

要するに共有フォルダです。

ホストOSのフォルダをゲストOSにマウントすることで
ホストOSで開発 → ゲストOSで実行
を可能にします。

しかしここで問題があって、Synced Folders を利用して開発をしていると権限まわりのトラブルが非常に多いです。

実行ユーザに権限があるはずなのに Operation not permitted とか怒られたらだいたいコイツのせいです。

ホストOSとゲストOSのファイルシステムの違いによるものらしいのですが、 対処法が全くわからないので今回は別の方法でやろうと思います。

Rsync Synced Folders

Vagrant 1.5 から RSync を用いてファイルを共有できるようになりました。

RSyncならゲストOSのファイルシステムもネイティブなまま使えるので、 権限まわりのトラブルを回避することができます。

Rsync Synced Folders を使うためには、Vagrantfile に以下のように設定します。

config.vm.synced_folder "./path/to/host/dir", "/path/to/guest/dir",
  type: "rsync",
  owner: "hoto",
  group: "users",
  rsync__exclude: [".git", "tmp", "log", "cache"],
  rsync__chown: false

ここで指定したフォルダは vagrant up 時または vagrant rsync を実行すると同期されますが、

vagrant rsync-auto

を実行しておくとホスト側のファイルに変更があった際に自動で同期してくれます。

以下、それぞれのオプションの解説。

type

type: "rsync" を指定すると、RSync を利用して共有するようになります。

RSync を利用するにはホストOSとゲストOSの両方に rsync コマンドが必要ですが、 ゲストOSには Vagrant が適宜 yum -y install rsync などを実行してくれるようです。

owner, group

通常の Synced Folders と同じで、ゲストOSでのファイルのオーナーとグループを指定します。

rsync__exclude

同期の対象外にするファイルやフォルダを指定します。

公式ドキュメントによると、 .git などを指定するといいらしいです。

rsync__chown

Vagrant Rsync では、同期をするたびにゲストOSのフォルダに chown -R {user}.{group} が実行されてファイルオーナーとグループがすべて統一されます。

おそらく同期に失敗しないための処理か何かなのでしょうけど、詳しいところはわからないです。

rsync__chownVagrant 1.6.3 から追加されたオプションで、 false を指定することで同期する際に自動で chown -R するのを抑制します。

アプリケーションのキャッシュやログファイルなどはファイルオーナーが apachenginx でないと動作しなかったりするので、 同期するたび自動で chown -R がかかると非常に不都合な場合にこのオプションを指定します。

使ってみた結果

RSyncによる共有にしてから権限まわりで躓くことがなくなったのでだいぶいい感じです。

また、rsync__chown はこのエントリ公開時点(2014/07)での最新版(1.6.3)でないと使えないオプションなので、 試す前に Vagrant を最新版にアップデートするのを忘れないようにしましょう。