LoginSignup
5
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-11

問題

最近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: )

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3