如何在Jelastic上使用Docker部署Play 2.5应用程序?

我想在Jelastic平台上部署一个使用Play Framework 2.5编写的应用程序。 我设法使用Play2War插件的Play,但它不支持Play 2.5。

平台的支持build议使用Docker容器或VPS。 我以前从来没有使用过Docker。 有一个SBT本地打包器插件提供了一种自动创buildSBT Dockerfile的方法。 所以这里是我的新plugins.sbt文件:

// The Play plugin addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.11") // Web plugins addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3") addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7") addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0") addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.2") // Play enhancer - this automatically generates getters/setters for public fields // and rewrites accessors of these fields to use the getters/setters. Remove this // plugin if you prefer not to have this feature, or disable on a per project // basis using disablePlugins(PlayEnhancer) in your build.sbt addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") // Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using // enablePlugins(PlayEbean). addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.0") // Play Eclipse plugin addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0") // Play native packager support for Docker addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.2.0-M8") 

这里是我的build.sbt文件与基于一些例子的Docker设置:

 import com.typesafe.sbt.packager.docker._ name := """VestaWeb""" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, DockerPlugin) scalaVersion := "2.11.7" // Configure Docker settings maintainer in Docker := "eeproperty" dockerRepository := Some("eeproperty") dockerBaseImage := "frolvlad/alpine-oraclejdk8:latest" dockerCommands := dockerCommands.value.flatMap { case cmd@Cmd("FROM", _) => List(cmd, Cmd("RUN", "apk update && apk add bash")) case other => List(other) } // Add dependencies from Maven libraryDependencies ++= Seq( filters, javaCore, javaJdbc, cache, javaWs, "mysql" % "mysql-connector-java" % "5.1.28", "com.stripe" % "stripe-java" % "2.10.0", "com.typesafe.play" %% "play-mailer" % "5.0.0", "it.innove" % "play2-pdf" % "1.5.1", "com.google.api-client" % "google-api-client" % "1.22.0", "org.apache.commons" % "commons-compress" % "1.12" ) // Remove the documentation from the dist sources in (Compile, doc) := Seq.empty publishArtifact in (Compile, packageDoc) := false // Disable strange behavior in local run fork in run := false 

命令:

 activator docker:stage 

产生这个Dockerfile:

 FROM frolvlad/alpine-oraclejdk8:latest RUN apk update && apk add bash MAINTAINER eeproperty WORKDIR /opt/docker ADD opt /opt RUN ["chown", "-R", "daemon:daemon", "."] USER daemon ENTRYPOINT ["bin/vestaweb"] CMD [] 

和其他一些东西,如docker/文件夹。

命令:

 activator docker:publish 

将Dockerfile(也可能是其他文件???)发布到我的Docker存储库。 我不知道Docker推到底是什么,也不知道如何在Alpine Linux基础镜像中embeddedPlay应用。

我添加了我的资源库到一个Docker实例和Jelastic,我开始了。 我可以通过SSHlogin到我的root帐户,但在容器中没有任何与我的应用相关的信息。 当我尝试在浏览器中打开Jelastic节点时,什么都没有显示。

Play Framework默认使用来自端口80的端口9000和Jelastic加载。 我想我将不得不添加一个iptables命令到我的Dockerfileredirect从80到9000的交通。

我已经阅读了很多关于“Dockerize Play应用程序”的教程,但他们从来没有解释如何部署应用程序,只有如何使用activator docker:publishLocal在本地运行容器。

我错过了什么观点?

我们已经用这个docker工具来重现这个问题。 docker在localhost上运行得很好,但是在Jelastic环境下效果不好。 当Docker中的用户拥有/ sbin / nologin shell而不是/ bin / bash时,根本原因是JE-29972-nologin:此帐户不可用 )。

作为一种解决方法,我们可以build议您更改/ etc / passwd并使用守护进程replace守护进程:x:2:2:守护进程:/ sbin:/ sbin / nologin :x:2:2:守护进程:/ opt / docker:/ bin / bash并在更改后重新启动您的环境。

有包含提到的解决方法的Docker设置的build.sbt文件:

 import com.typesafe.sbt.packager.docker._ name := """test""" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayJava, DockerPlugin) scalaVersion := "2.11.7" // Configure Docker settings maintainer in Docker := "eeproperty" dockerExposedPorts := Seq(9000) dockerRepository := Some("eeproperty") dockerBaseImage := "frolvlad/alpine-oraclejdk8:latest" dockerCommands := dockerCommands.value.flatMap { case cmd@Cmd("FROM", _) => List(cmd, Cmd("RUN", "apk update && apk --no-cache add bash shadow && usermod -s /bin/bash daemon && usermod -d /opt/docker/ daemon")) case other => List(other) } libraryDependencies ++= Seq( javaJdbc, cache, javaWs ) sources in (Compile, doc) := Seq.empty publishArtifact in (Compile, packageDoc) := false