概要
ホストのフォルダとコンテナ内のフォルダの同期方法について調べていて見かけたので試してみる。
実行環境について
Vagrantで構築している下記CentOS7.5環境で試す。
※ vagrant/CentOS7.5
上記環境については、プロビジョニングで下記アプリが自動でインストールされます。
- docker
- docker-compose
- git, vim
docker-syncのインストール
CentOSのyumが使えないようなので、gemでインストールすることにしました。
# rubyのインストール
$ sudo yum -y install ruby ruby-devel
# gemコマンドにてdocker-syncをインストール
$ gem install docker-sync
# バージョン確認
$ docker-sync -v
0.5.7
同期の方法について
rsync、unisonの指定ができるようです。
ただし、どちらの方法を使うにも下記ツールのインストールが必要そうです。
- rsync : fswatch
- unison: unison, unison-fsmonitor
unisonは、brewでのインストールが必要で、面倒そうなのでやめるてrsyncを選択する。
※ Qiita - CentOSでも使用できるHomebrew(Linuxbrew)の導入
fswatchのインストール
下記コマンドにて、インストールする。
※ fswatch – Monitors Files and Directory Changes or Modifications in Linux
# ソースダウンロード
$ wget https://github.com/emcrisostomo/fswatch/releases/download/1.9.3/fswatch-1.9.3.tar.gz
$ tar -xvzf fswatch-1.9.3.tar.gz
$ cd fswatch-1.9.3
# インストール
$ ./configure
$ make
$ sudo make install
# バージョン確認
$ fswatch --version
fswatch 1.9.3
ファイル構成
ファイルの構成は、以下のようになります。
├ sync ※ 同期するフォルダ
│ └ .gitkeep
│
├ docker-compose.yml ※ docker-composeの設定
└ docker-sync.yml ※ docker-syncの設定
docker-compose.yml
version: '2'
services:
code:
image: busybox
container_name: 'code'
tty: true
volumes:
- sync-volume:/var/www/ # ← ここでボリュームを指定する
volumes:
sync-volume: # ← ここでdocker-syncで作成した外部のボリュームを読み込む
external: true
docker-sync.yml
version: "2"
syncs:
sync-volume:
src: './sync/'
sync_host_ip: '127.0.0.1'
sync_host_port: '5000'
sync_strategy: 'rsync'
sync_excludes: ['.idea']
以上で準備完了。
テスト
同期されるかテストしてみる。
# sync-volume生成
$ docker-sync start
ok Starting rsync for sync sync-volume
ok Synced /home/vagrant/opt/docker-sync/sync/
success Rsync server started
ok Synced /home/vagrant/opt/docker-sync/sync/
success Starting Docker-Sync in the background
# sync-volumeコンテナが起動する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72a142f55b72 eugenmayer/rsync "/entrypoint.sh supe…" 17 minutes ago Up 20 seconds 0.0.0.0:5000->873/tcp sync-volume
# sync-volumeが出来上がる
$ docker volume ls
DRIVER VOLUME NAME
local sync-volume
同期するcodeコンテナを起動する。
$ docker-compose up -d
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2068d320626 busybox "sh" 4 seconds ago Up 3 seconds code
72a142f55b72 eugenmayer/rsync "/entrypoint.sh supe…" 19 minutes ago Up About a minute 0.0.0.0:5000->873/tcp sync-volume
syncフォルダ内にファイルを作ってみる。
$ touch sync/test.log
コンテナ内にファイルが作られたか確認してみる。
$ docker exec code ls -la /var/www
total 0
-rw-r--r-- 1 1000 1000 0 Jun 19 11:22 .gitkeep
-rw-r--r-- 1 1000 1000 0 Jun 19 11:52 test.log
問題なく同期されるようです。
ただし、ホストのフォルダをコンテナ内にマウントするのと特に動きが同じみたい。
(同期するとコンテナ内のファイルが消えてホスト側のファイルで上書きされる)
やりたかったのは、コンテナ内のフォルダをホスト側に共有したいという用途には使えなさそう・・・。
(コンテナ内のファイルを残したまま、ホストのフォルダに共有したかった・・・)
下記コマンドで、コピーしてごにょごにょするしかないのかな・・・
docker cp code:/var/www/ ./sync/
残念。