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

我正在尝试设置一个开发环境,用于在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

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

[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes...
[success] Compiled in 2s

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

编辑:
这是我用于使用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

我做了更多的研究.在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

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

[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes...
[success] Compiled in 1s

刷新浏览器仍会显示初始索引文件.即使更改是由容器内的播放应用程序进行检测.我还检查了目标/ 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,use Ctrl+D to stop and go back to the console...)

[info] play - Application started (Dev)

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

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

PlayKeys.playWatchService := play.sbtplugin.run.PlayWatchService.sbt(pollInterval.value)

答案取自github:Play 2.3.2 auto reload is not working on shared folder上的问题帖子

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

PlayKeys.fileWatchService := play.runsupport.FileWatchService.sbt(pollInterval.value)

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

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

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...