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

标签 java docker playframework dockerfile jelastic

我想在 Jelastic 平台上部署使用 Play Framework 2.5 编写的应用程序。我设法使用 Play2War Play 插件,但尚不支持 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 向它推送了什么,也不知道它如何知道如何将 Play 应用程序嵌入到 Alpine Linux 基础镜像中。

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

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

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

我错过了什么?

最佳答案

我们已经重现了该 docker 的问题。 docker 在 localhost 上运行良好,但在 Jelastic 环境中运行不佳。 根本原因是当 Docker 内的用户使用 /sbin/nologin shell 而不是 /bin/bash 时,出现错误 JE-29972(-nologin:此帐户不可用)。

作为解决方法,我们建议您更改 /etc/passwd 并将 daemon:x:2:2:daemon:/sbin:/sbin/nologin 替换为 daemon:x:2:2:daemon:/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

关于java - 如何使用 Docker 在 Jelastic 上部署 Play 2.5 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42142346/

相关文章:

java - 是否缺少正确对齐输出的值?

java - 从 java 客户端应用程序的请求中设置的 CookieStore 检索 cookie

java - urlencode() 'asterisk'(星号?)字符

python - 为什么使用 Selenium webdriver 在我的 Mac 本地可以很好地执行 JS,但在 Docker 容器中却不行?

java - 为什么声明 "Driver not found: [org.postgresql.Driver]"与 postgresql 9.3-1102.jdbc41 依赖关系?

scala - 如何编写被枚举者沿不同边界对枚举器进行分块

java - 文件在 IntelliJ IDEA 中以错误的编码 :'UTF-8' 加载

python-3.x - docker-compose找不到文件

ubuntu - 如何删除docker中的目录?

scala - Play Framework Scala 在后台运行作业