最近のsbt-native-packagerは、プロジェクトのjarを実行するDockerイメージの生成を試験的にサポートしています。
Dockerイメージの生成方法
設定方法
sbtのプラグイン設定にsbt-native-packagerを追加します。
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.0-M4")
ビルド設定に普段Dockerfileに記述する内容を追加します。設定可能な内容はKeys.scalaで確認できます。
enablePlugins(JavaAppPackaging)
maintainer in Docker := "Duke"
dockerBaseImage in Docker := "dockerfile/java"
dockerExposedPorts in Docker := Seq(8080, 8080)
実行方法
sbtのターゲットにdocker:stage
やdocker:publishLocal
を指定して実行します。
# Dockerfileおよびコンテナに追加するファイルを生成します。
sbt docker:stage
# Dockerイメージを生成します。
sbt docker:publishLocal
例:簡単なウェブアプリケーションを作成する
例として、以下のような簡単なウェブアプリケーションを作成します。
package org.example
import unfiltered.request._
import unfiltered.response._
object Server extends App {
val echo = unfiltered.filter.Planify {
case Path(Seg(p :: Nil)) => ResponseString("Hello, " + p)
}
unfiltered.jetty.Server.http(8080).plan(echo).run()
}
enablePlugins(JavaAppPackaging)
organization := "org.example"
name := "sbt-docker-example"
version := "1.0-SNAPSHOT"
scalaVersion := "2.11.4"
libraryDependencies ++= Seq(
"net.databinder" %% "unfiltered-filter" % "0.8.4",
"net.databinder" %% "unfiltered-jetty" % "0.8.4"
)
maintainer in Docker := "Shun Takebayashi"
dockerBaseImage in Docker := "dockerfile/java"
sbt docker:stage
を実行すると、以下のようなDockerfileと、Dockerfile内でADDするように指定されているファイル群が生成されます。
FROM dockerfile/java
MAINTAINER Shun Takebayashi
EXPOSE 8080 8080
ADD opt /opt
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
USER daemon
ENTRYPOINT ["bin/sbt-docker-example"]
CMD []
sbt docker:publishLocal
を実行すると、上記の内容のDockerイメージがビルドされます。docker images
を実行し、sbt-docker-example:1.0-SNAPSHOT
というイメージが生成されたことを確認できます。
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
sbt-docker-example 1.0-SNAPSHOT 4efa038b97c0 7 seconds ago 723 MB
dockerfile/java latest e5b3ce7f0b79 11 days ago 705.7 MB
docker run
コマンドでコンテナを実行します。
docker run -d -p 8080:8080 sbt-docker-example:1.0-SNAPSHOT
curl -i http://localhost:8080/duke
を実行し、正常にウェブアプリケーションが動作していることを確認できました。
HTTP/1.1 200 OK
Content-Length: 11
Server: Jetty(8.1.13.v20130916)
Hello, duke