LoginSignup
52
51

More than 5 years have passed since last update.

Play Framework標準装備でdockerイメージを作る

Last updated at Posted at 2015-01-16

Play Framework 2.3.4で試しました。dockerコマンドは別途インストールが必要だと思います。

いつもactivator distで本番用にビルドしていたのですが、https://www.playframework.com/documentation/2.3.x/ProductionDist を読んでいたら、SBT Native Packager pluginが使われているとありました。

SBT Native Packager pluginのドキュメントを見てみると、Docker Pluginというのがありました。

やり方

まずbuild.sbtにこれを追加します。maintainerだけは必須の設定項目です。

// for `activator docker:publishLocal`
// ref: http://www.scala-sbt.org/sbt-native-packager/formats/docker.html
import NativePackagerKeys._

maintainer in Docker := "Atsushi Takayama <taka.atsushi@gmail.com>"

dockerExposedPorts in Docker := Seq(9000, 9443)

(sbt 0.13.7からだとimportがbuild.sbtの 途中 に出てきてもシンタックスエラーにならなくなったみたいですが、それ以前のバージョンの人はbuild.sbtの に書かないといけないのでお気をつけ下さい)

それから

./activator docker:publishLocal

とやると、build.sbtのnameversionに合わせた名前でdockerイメージが作成されます。例えば

name := "pploy"

version := "0.5.4"

の場合であればpploy:0.5.4という名前です。このようにすれば実行できます。

docker run --net=host pploy:0.5.4

設定項目

http://www.scala-sbt.org/sbt-native-packager/formats/docker.htmlにあり、数は多くないです。以下にいくつか書いてみます。

Dockerfileだけ欲しい

./activator docker:stage

にすると、target/docker/以下にDockerfilesとfilesというディレクトリが作成されます。Dockerfileはこのようになっていました。

FROM dockerfile/java
MAINTAINER Atsushi Takayama <taka.atsushi@gmail.com>
EXPOSE 9000 9443
ADD files /
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
USER daemon
ENTRYPOINT ["bin/pploy"]
CMD []

ベースイメージを変更したい

デフォルトではFROM dockerfile/javaになります。これを変更するにはbuild.sbtに

dockerBaseImage := "dockerfile/java:oracle-java8"

のように書きます。dockerfile/javaはubuntuベースなので、debianベースに変更するには自分で公式のdockefile/debianからdockerfile/javaのDockerfileを参考にイメージを作って、それをdockerBaseImageに指定するのが良いと思います。

レジストリにpushしたい

quay.io/edvakf/pployというレジストリにpushしたい場合は、build.sbtに

dockerRepository := Some("quay.io/edvakf")

と書いて

./activator docker:publish

とやると、quay.io/edvakf/pploy:0.5.4としてpushされるはずです。

起動オプションを変えたい

dockerEntrypoint in Dockerを変えるのだと思いますが、Play 2.3.4だとnot found: value dockerEntrypointと言われるので、新しいオプションなのかもしれません。

activator docker:stageしてからDockerfileの

ENTRYPOINT ["bin/pploy"]
CMD []

を例えばこのように置換してから

ENTRYPOINT ["bin/pploy"]
CMD ["-Dconfig.resource=prod.conf"]

cd target/docker && docker build -t pploy .とかやると一応できました。

Best practices for writing Dockerfilesを見る感じではどちらかというとENTRYPOINTを消してCMD ["bin/pploy", "-Dconfig.resource=prod.conf"]とするほうが良いのかもしれません)

実行時に起動オプションを変えたい

docker runでアプリケーションの起動オプションを変更するには、

docker run --entrypoint=/opt/docker/bin/pploy pploy:0.5.4 -Dconfig.resource=prod.conf
                        ~~~~~~~~~~~~~~~~~~~~~             ~~~~~~~~~~~~~~~~~~~~~~~~~~~

のようにします。pploy:0.5.4の部分がイメージ名とタグで、--entrypoint=/opt/docker/bin/pployが起動コマンド、後ろの-Dconfig.resource=prod.confが起動コマンドのオプションになります。順番がとてもわかりにくいですね。

こうすることもできます。

docker run --entrypoint=/bin/sh pploy:0.5.4 -c /opt/docker/bin/pploy -Dconfig.resource=prod.conf
                        ~~~~~~~             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/bin/shがコマンドで、後ろの-c /opt/docker/bin/pploy -Dconfig.resource=prod.confがコマンドのオプションです。

ビルドもdockerの中でやりたい

残念ながらそのような方法は提供されていません。ホストOS側のJDKでビルドされて、jarだけがdockerイメージに入ることになります。

僕の想定する用途ではJenkinsでビルドしたかったのですが、Jenkinsの入ってるサーバーのJDKを変えるのが面倒なのでビルドもdockerでやってしまおうかと思っているので、別途やり方を調べたいと思います。

追記:続きを書いた→Dockerの中でPlay Frameworkのプロジェクトをビルドしてzipを取り出す

52
51
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
51