Posted at

sbt-native-packagerでDockerイメージを生成する

More than 3 years have passed since last update.

最近のsbt-native-packagerは、プロジェクトのjarを実行するDockerイメージの生成を試験的にサポートしています。


Dockerイメージの生成方法


設定方法

sbtのプラグイン設定にsbt-native-packagerを追加します。


prject/plugins.sbt

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


ビルド設定に普段Dockerfileに記述する内容を追加します。設定可能な内容はKeys.scalaで確認できます。


build.scala

enablePlugins(JavaAppPackaging)

maintainer in Docker := "Duke"

dockerBaseImage in Docker := "dockerfile/java"

dockerExposedPorts in Docker := Seq(8080, 8080)



実行方法

sbtのターゲットにdocker:stagedocker:publishLocalを指定して実行します。

# Dockerfileおよびコンテナに追加するファイルを生成します。

sbt docker:stage

# Dockerイメージを生成します。
sbt docker:publishLocal


例:簡単なウェブアプリケーションを作成する

例として、以下のような簡単なウェブアプリケーションを作成します。


src/main/scala/org/example/Server.scala

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()
}



build.scala

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するように指定されているファイル群が生成されます。


target/docker/Dockerfile

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