在docker容器中播放框架自动加载

jor*_*nfb 7 development-environment playframework docker boot2docker

我正在尝试设置一个开发环境,用于在docker容器中开发一个play应用程序.我已经安装了sbt创建了一个图像.然后,我将主机上的项目文件夹映射为容器作为卷,并以交互方式运行shell:

docker run -v /Users/jorgen/dev/play-sbt-docker/app:/data/app -w /data/app -p 9999:9000 -i -t jorgenfb/sbt /bin/bash
Run Code Online (Sandbox Code Playgroud)

然后我通过运行启动播放应用程序sbt ~run.播放服务器启动只是查找,它甚至重新编译我在主机上编辑我的文件:

[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes...
[success] Compiled in 2s
Run Code Online (Sandbox Code Playgroud)

问题是刷新时浏览器中没有出现更改.由于禁用了缓存,因此没有缓存问题.如果我从我的主机运行应用程序,一切正常.

编辑:这是我用于使用sbt创建容器的Dockerfile:

FROM dockerfile/java:oracle-java8
MAINTAINER  Jørgen Borgesen

ENV SBT_VERSION 0.13.5

# Install sbt
RUN cd /tmp && \
    wget https://dl.bintray.com/sbt/native-packages/sbt/$SBT_VERSION/sbt-$SBT_VERSION.zip && \
    unzip sbt-$SBT_VERSION.zip -d /usr/local && \
    rm sbt-$SBT_VERSION.zip
Run Code Online (Sandbox Code Playgroud)

我做了一些更多的研究.在docker容器内部,我启动播放应用程序,如下所示:

[ root@aa1f2327d938:/data/app ]$ /usr/local/sbt/bin/sbt
[info] Loading project definition from /data/app/project
[info] Set current project to my-first-app (in build file:/data/app/)
[my-first-app] $ ~run

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[success] Compiled in 740ms
Run Code Online (Sandbox Code Playgroud)

在我的浏览器中加载页面工作正常.然后我在主机上更改我的索引文件.这会触发在容器内重新编译:

[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes...
[success] Compiled in 1s
Run Code Online (Sandbox Code Playgroud)

刷新浏览器仍会显示初始索引文件.即使更改是由容器内的播放应用程序进行检测.我还检查了编译文件target/scala-2.10/classes/views/html(在我的主机上,因为我在容器中运行播放应用程序,我不知道如何将多个终端连接到它).编译的文件已更改.

我接下来要做的就是按下Ctrl-D.这应该根据上面打印的消息回到sbt控制台"(服务器启动,使用Ctrl + D停止并返回控制台......)".但是,这会产生以下输出:

[success] Total time: 455 s, completed Sep 25, 2014 7:40:35 AM
1. Waiting for source changes... (press enter to interrupt)

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] play - Application started (Dev)
Run Code Online (Sandbox Code Playgroud)

现在,我之前做出的更改会在刷新后反映在浏览器中.

jor*_*nfb 10

我解决了这个问题(有点).该问题不是特定于docker或play框架,而是与使用JNotify检测文件更改有关(play使用此库).使用本机文件系统挂钩检测更改.这些挂钩在虚拟机的共享文件夹中不可用(我在VMX上运行docker服务,因为我在OSX上).这意味着自动检测文件更改的唯一方法是使用轮询策略.Play框架支持2.3.2及更高版本.要启用,请将其添加到build.sbt:

PlayKeys.playWatchService := play.sbtplugin.run.PlayWatchService.sbt(pollInterval.value)
Run Code Online (Sandbox Code Playgroud)

答案取自github上的问题帖子:播放2.3.2自动重新加载不在共享文件夹上

更新播放2.4:播放2.4重命名配置参数.这是如何在2.4中启用轮询:

PlayKeys.fileWatchService := play.runsupport.FileWatchService.sbt(pollInterval.value)
Run Code Online (Sandbox Code Playgroud)

感谢philipphoffmann对更新信息的回答.添加到我的答案中为2.3和2.4提供解决方案.

更新:我刚刚为OSX用户发现了一个方便的工具:docker-osx-dev.它使用rsync来保持主机和虚拟文件系统同步.这将触发虚拟机上的文件系统更改.