playframework + Docker + twitter4j

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

# <i class="fa fa-cogs"></i> 手順
docker のインストール
build.sbtにリポジトリ情報を記載(dockerhubにイメージをpushします)
docker terminal 起動
./activator docker:publish 実行
Dockerrun.aws.json 作成
Dockerrun.aws.json を指定してデプロイ


# <i class="fa fa-cogs"></i> 設定 (sbt-native-packager を使ってDockerイメージ作成)

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

```scala:plugin.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.6")
```

```scala: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"
}
```

# <i class="fa fa-cogs"></i> ローカル実行
Dockerイメージの作成: `activator docker:publishLocal`
Docker実行: `docker run -it -p 80:9000 <name>:<version>`

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

# <i class="fa fa-cogs"></i> WindowsでのDockerの罠
http://qiita.com/chiepomme/items/79be03c5d04937701c3d
上記記事に従って設定してやらないとうまくいかない。

# <i class="fa fa-cogs"></i> 参考
http://qiita.com/yuukigoodman/items/ed88de93bee0bc775ff0

# <i class="fa fa-cogs"></i> なぜかDockerHubからイメージを落とせない事象
S3にdockerhubにアクセスするためのconfig.jsonを置いて読みこむようにしたのですが、何故かうまく行きませんでしたが、
elastick beanstalkのEC2にsshで入って `sudo docker login` コマンドを叩いてからデプロイしたら行けるようになりました。
よくわかりません(´・ω・`)

# <i class="fa fa-cogs"></i> Dockerrun.aws.json
ContainerPortにplay起動のデフォルトポートである9000番を指定してやることでアクセス出来るようになりました。

```json

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

# <i class="fa fa-cogs"></i> 本番用configファイル読み込み
confディレクトリ配下にapplication.product.confというファイルを用意してそちらに本番用の設定を入れます。

```
include "application.conf"
play.crypto.secret="XXXXXXXXXXX"
```

とりあえずテストしたいだけだし、といって
play.crypto.secret = "changeme"
のままにしていると設定しろと怒られるのできちんと設定しましょう。

# <i class="fa fa-cogs"></i> 最後に
ところどころ省略してますが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"))
```