PlayFramework
docker
Twitter4J

playframework + Docker + twitter4j

More than 3 years have passed since last update.

AWS の Elastic Beanstalkで playframework を Docker を使用して動作させるために色々弄ったのでメモ。


手順

docker のインストール

build.sbtにリポジトリ情報を記載(dockerhubにイメージをpushします)

docker terminal 起動

./activator docker:publish 実行

Dockerrun.aws.json 作成

Dockerrun.aws.json を指定してデプロイ


設定 (sbt-native-packager を使ってDockerイメージ作成)

http://www.scala-sbt.org/sbt-native-packager/formats/docker.html


plugin.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.6")



build.sbt

import com.typesafe.config.ConfigFactory

import com.typesafe.sbt.packager.docker._
import play.sbt.PlayImport.PlayKeys.playRunHooks

name := """XXXX"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file("."))
.enablePlugins(PlayScala, JavaAppPackaging, DockerPlugin)

/* === 省略 === */

mappings in Docker += {
// twitter4j を使用するための twitter4j.properties を入れる
val twitter4j = (baseDirectory in Compile).value / "twitter4j.properties"
twitter4j -> "opt/docker/twitter4j.properties"
}



ローカル実行

Dockerイメージの作成: activator docker:publishLocal

Docker実行: docker run -it -p 80:9000 <name>:<version>

dockerのIPにhttp://xxxで繋いでやると、きちんと動作していることを確認できます。


WindowsでのDockerの罠

http://qiita.com/chiepomme/items/79be03c5d04937701c3d

上記記事に従って設定してやらないとうまくいかない。


参考

http://qiita.com/yuukigoodman/items/ed88de93bee0bc775ff0


なぜかDockerHubからイメージを落とせない事象

S3にdockerhubにアクセスするためのconfig.jsonを置いて読みこむようにしたのですが、何故かうまく行きませんでしたが、

elastick beanstalkのEC2にsshで入って sudo docker login コマンドを叩いてからデプロイしたら行けるようになりました。

よくわかりません(´・ω・`)


Dockerrun.aws.json

ContainerPortにplay起動のデフォルトポートである9000番を指定してやることでアクセス出来るようになりました。



{
"AWSEBDockerrunVersion": "1",
"Authentication": {
"Bucket": "<s3bucket name>",
"Key": "<key>"
},
"Image" : {
"Name" : "docker.io/<username>/<app name>:<tag>",
"Update": "true"
},
"Ports" : [{ "ContainerPort": "9000" }]
}


本番用configファイル読み込み

confディレクトリ配下にapplication.product.confというファイルを用意してそちらに本番用の設定を入れます。

include "application.conf"

play.crypto.secret="XXXXXXXXXXX"

とりあえずテストしたいだけだし、といって

play.crypto.secret = "changeme"

のままにしていると設定しろと怒られるのできちんと設定しましょう。


最後に

ところどころ省略してますがbuild.sbtを記載しておきます。


build.sbt

import com.typesafe.config.ConfigFactory

import com.typesafe.sbt.packager.docker._
import play.sbt.PlayImport.PlayKeys.playRunHooks

name := """<application name>"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file("."))
.enablePlugins(PlayScala, JavaAppPackaging, DockerPlugin)
.settings(
slick <<= slickCodeGenTask
)

/** 省略 */

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
/** 省略 */
)

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"

// Play provides two styles of routers, one expects its actions to be injected, the
// other, legacy style, accesses its actions statically.
routesGenerator := InjectedRoutesGenerator

//LessKeys.compress in Assets := true

includeFilter in (Assets, LessKeys.less) := "*.less"

excludeFilter in (Assets, LessKeys.less) := "_*.less"

playRunHooks <+= baseDirectory.map(base => GulpRunner(base))

mappings in Docker += {
val twitter4j = (baseDirectory in Compile).value / "twitter4j.properties"
twitter4j -> "opt/docker/twitter4j.properties"
}

dockerRepository := Some("<username>")

dockerEntrypoint := Seq("bin/<application name>")

dockerCommands ++= Seq(ExecCmd("CMD", "-Dconfig.resource=application.product.conf"))