我正在尝试设置一个开发环境,用于在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)
现在,我之前做出的更改会在刷新后反映在浏览器中.
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来保持主机和虚拟文件系统同步.这将触发虚拟机上的文件系统更改.