如何在带有Docker的Jelastic上部署Play 2.5应用程序?

时间:2017-02-09 16:47:55

标签: java docker playframework dockerfile jelastic

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

平台的支持建议使用Docker容器或VPS。我以前从未使用过Docker。有SBT native packager plugin提供了一种使用SBT自动创建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基础图像中嵌入Play应用程序。

我将我的存储库添加到Docker实例和Jelastic,我启动了它。我可以通过SSH登录到我的root帐户,但是我的应用程序与容器中没有任何关系。当我尝试在浏览器中打开Jelastic节点时,没有任何内容出现。

Play Framework默认使用端口80中的端口9000和Jelastic加载。我想我必须在我的Dockerfile中添加iptables命令,将流量从80重定向到9000.

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

我错过了什么点?

1 个答案:

答案 0 :(得分:0)

我们已经使用该docker重现了该问题。 docker在localhost上工作得很好但是作为Jelastic环境不能很好地工作。 当docker中的用户具有 / sbin / nologin JE-29972 -nologin:此帐户不可用) > shell而不是 / bin / bash

作为解决方法,我们建议您更改 / etc / passwd 并替换守护程序:x:2:2:守护程序:/ sbin:/ sbin / nologin 使用守护程序:x:2:2:守护程序:/ opt / docker:/ bin / bash 并在更改后重新启动环境。

build.sbt 文件包含Docker设置,其中包含上述解决方法:

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