docker上で起動するRevelのHot-reloadを効かせる工夫

  • 5
    Like
  • 0
    Comment
More than 1 year has passed since last update.

問題

最近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に乗り換えようかな・・ :expressionless: )