7

docker コンテナーで play アプリケーションを開発するための開発環境をセットアップしようとしています。sbt をインストールしたイメージを作成しました。次に、ホストのプロジェクト フォルダーをボリュームとしてコンテナーにマップし、対話モードでシェルを実行します。

docker run -v /Users/jorgen/dev/play-sbt-docker/app:/data/app -w /data/app -p 9999:9000 -i -t jorgenfb/sbt /bin/bash

次に、 を実行して play アプリケーションを起動します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 コンテナー内で、次のように play アプリケーションを開始します。

[ 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

ブラウザを更新しても、最初のインデックス ファイルが表示されます。変更がコンテナー内の再生アプリケーションによって取得された場合でも。また、コンパイルされたファイルを調べましたtarget/scala-2.10/classes/views/html(コンテナーで play アプリケーションを実行していて、複数のターミナルを接続する方法がわからないため、ホスト上で)。コンパイルされたファイルが変更されました。

次に行ったのは、Ctrl-D を押すことでした。これにより、上記の「(Server started, use Ctrl+D to stop and go back to the console...)」という出力メッセージに従って、sbt コンソールに戻るはずです。ただし、これにより次の出力が得られます。

[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)

以前に行った変更は、更新後にブラウザーに反映されます。

4

2 に答える 2

10

問題を解決しました(一種)。この問題は docker または play フレームワークに固有のものではありませんが、ファイルへの変更が JNotify を使用して検出される方法に関連しています (play はこのライブラリを使用します)。変更は、ネイティブ ファイル システム フックを使用して検出されます。これらのフックは、仮想マシンの共有フォルダーでは使用できません (私は OSX を使用しているため、VM マシンで docker サービスを実行しています)。つまり、ファイルの変更を自動的に検出する唯一の方法は、ポーリング戦略を使用することです。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

Play 2.4 の更新: Play 2.4 は構成パラメーターの名前を変更します。2.4 でポーリングを有効にする方法は次のとおりです。

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

更新された情報を提供してくれた philippoffmann に感謝します。2.3 と 2.4 の両方のソリューションを提供するために、それを私の回答に追加しました。

更新: OSX ユーザー向けの便利なツールdocker-osx-devを発見しました。rsync を使用して、ホストと仮想ファイル システムの同期を維持します。これにより、仮想マシンでファイル システムの変更がトリガーされます。

于 2014-09-25T10:09:45.657 に答える
3

play 2.4 の場合、これは次のようになります。

PlayKeys.fileWatchService := play.runsupport.FileWatchService.sbt(pollInterval.value)
于 2015-06-13T20:11:46.947 に答える