Как развернуть приложение Play 2.5 на Jelastic с помощью Docker?

Я хочу развернуть приложение, написанное с помощью Play Framework 2.5, на платформе Jelastic. Мне удалось использовать плагин Play2War для Play, но он еще не поддерживает Play 2.5 .

Поддержка платформы рекомендовала использовать контейнер Docker или VPS. Я никогда раньше не работал с Докером. Для обеспечения способ автоматически создать Dockerfile с помощью SBT. Итак, вот мой новый файл 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 и запустил его. Я могу войти в свою учетную запись root через SSH, но в контейнере нет ничего, связанного с моим приложением. Когда я пытаюсь открыть узел Jelastic в своем браузере, ничего не появляется.

Play Framework по умолчанию использует порт 9000 и загрузку Jelastic с порта 80. Думаю, мне придется добавить команду iptables в мой Dockerfile, чтобы перенаправить трафик с 80 на 9000.

Я прочитал МНОГО руководств по «Dockerize a Play app», но они никогда не объясняют, как развернуть приложение, а только как запустить контейнер локально с activator docker:publishLocal.

Какой момент я упустил?


person didil    schedule 09.02.2017    source источник
comment
Ваш докер работает локально и папка / opt / не пуста?   -  person Aless    schedule 13.02.2017


Ответы (1)


Мы воспроизвели проблему с этим докером. Докер хорошо работает на локальном хосте, но не работает в среде Jelastic. Основная причина - ошибка JE-29972 (-nologin: эта учетная запись недоступна), когда пользователь внутри докера имеет / sbin / nologin shell вместо / bin / bash.

В качестве обходного пути мы можем предложить вам изменить / etc / passwd и заменить daemon: x: 2: 2: daemon: / sbin: / sbin / nologin на daemon: x: 2: 2: daemon: / 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
person Jelastic    schedule 14.02.2017