問題
最近GoのRevelフレームワークを使って開発をしています。
がしかし、dockerコンテナでRevelを立ち上げると、Macのホストマシンの方でコンテナの$GOPATH
にマウントしたディレクトリ内のファイルを変更してもHot-reloadが効かずに困っていました orz
(dockerコンテナ上でファイル変更したら当然検知してくれます)
どうやら原因はRevel自体の既知の問題でマウントしたディレクトリに対してはファイル変更を検知してくれないっぽいです
https://github.com/revel/revel/issues/1026
解決方法
gulpのwatchを使った以下の方法でHot-reloadを効かせます
docker run
でコンテナ作成時に$GOPATH
とは違うディレクトリにローカルのrevelプロジェクトをマウント
docker run --privileged -d \
-p 9000:9000 \
-v ~/go/src/revel_sample:/usr/local/src/revel_sample \
--name test_go \
--hostname test_go \
-t go:centos7 \
/sbin/init
dockerコンテナ上でマウントしたディレクトリをgulp-watch
で監視してファイル変更があった場合は$GOPATH/src
下にコピーします。
gulpfile.js
var gulp = require('gulp');
var changed = require('gulp-changed');
var watch = require("gulp-watch");
var srcDir = '/usr/local/src/revel_sample/**';
var dstDir = '/usr/local/go/src/revel_sample/';
gulp.task("watch", function () {
watch(srcDir, function(event){
gulp.start("copy");
});
});
gulp.task("copy", function () {
gulp.src(srcDir)
.pipe(changed(dstDir))
.pipe(gulp.dest(dstDir))
});
gulp.task('default', ['watch']);
あとはコンテナ上でgulpを動かした上でrevelを起動します。
cd (gulpfile.jsが置いてあるディレクトリ)
gulp
revel run revel_sample
若干面倒くさいですが、こうするとホストマシンでファイル変更してもHot-reloadが効くようになります。
(もうGinやEchoに乗り換えようかな・・ )