- mount 遅い問題をなんとかしたい
- docker のリセットで volume が失われないようにしたい
- docker-sync で解決しよう
CONTENTS
mount 遅い問題
Docker for Mac で開発環境を構築する の形でしばらく運用していたのだが、ホストのディレクトリを直接 mount するのがとても遅いため、なんとかしたくなった。
ホストのディレクトリを mount するのはなぜか
Docker は結構不安定で、「リセット」で完全にデータを削除しないと立ち上がらなくなることがままある。
Docker for Mac は volume の内容が Mac からアクセスできない。 Docker が動いていれば方法はあるが、今必要なのは Docker が起動しなくなった時に volume を救出する方法だ。
CoreOS で運用していた時は volume の内容が見えていたので、これをバックアップしておけば、データを削除しても volume の復旧が簡単だった。
volume 上に開発中のコードや鍵などが保存されているため、これらが失われてしまうのは非常に面倒だ。
そこで、ホストのディレクトリを直接 mount させることで解決しよう、と考えたわけだ。
しかし、 Docker for Mac でホストのディレクトリをマウントするととても遅い。 Mac のファイルシステムとの相性の問題らしいが、詳しいことは調べていない。 最近のアップデートで、マウントするときのフラグを指定していくらか改善したが、満足できる速度にはならなかった。
開発に使用している volume をホストにバックアップ
ホストのディレクトリをマウントすると遅いので、普通の volume を使用して開発することを考える。 しかし、普通の volume を使用すると、 Docker が起動しなくなった時に volume の救出が難しい。
そこで、 volume の内容をホストにバックアップしておくことにする。 コンテナで rsync 等を動かしてホストにバックアップすれば良いだろう。 すでにツールがあるので、それを導入する。
docker-sync 導入
docker-sync は ruby で書かれていて gem になっている。 今回は Mac にインストールされているシステムの ruby を使用することにした。
sudo gem install -n /usr/local/bin docker-sync
インストールが以下のエラーで止まったので、調べてみると開発用のツールが足りないらしい。
mkmf.rb can't find header files for ruby
これによれば XCode のツールをインストールする必要がある。
sudo xcode-select --install
docker-sync.yml
現在使用している docker-sync.yml は以下の内容だ。
version: "2" options: verbose: true syncs: apps: sync_userid: '1000' src: './apps' sync_excludes: [] home: sync_userid: '1000' src: './home' sync_excludes: [".local/share/nvim/swap"]
ディレクトリ構成は以下の通り。
./ + docker-sync.yml + apps/ + home/
docker-sync start
で、 apps と home という volume にそれぞれファイルがコピーされる。
あとは、 apps と home をマウントして開発を開始すれば良い。 volume に対して行なった変更も、ホストのディレクトリに対して行なった変更も、双方向で同期される。
ホストのディレクトリをタイムマシンの対象ディレクトリに置いておけば、バックアップもひとまず安心だ。
システムの ruby を使用するのはなぜか
rbenv などのツールを使用して、システムの gem を使用しないようにした方が良さそうに思える。
しかし、 Docker で環境を構築する動機の1つに、開発機を素早く移行したいというものがあるのだ。 Mac にインストールするものは最小限にしたい。
Mac 上で直接 ruby の開発をするわけではなく、ツールを使用するだけだ。 なので、システムの ruby を使用することにした。
まとめ
Docker for Mac で開発環境を構築して、快適に開発することができるようになってきた。
docker-sync
を使用することになったが、この依存はしょうがないと割り切ることにした。