LoginSignup
24
21

More than 5 years have passed since last update.

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

Posted at

最近の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
24
21
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
24
21