sbt로 AkkaHttp 서버의 Docker 이미지와 RPM 만들기

sbt-native-packager를 사용하여 AkkaHttp 서버의 Docker 이미지와 RPM을 만드는 방법에 대해 설명합니다.

[sbt-native-packager]
htps //w w. s 또는 sbt. 오 rg / sbt - 나치 ゔ ぇ 파 c
  • 동작 확인 환경: Mac Mojave 10.14.1

  • 이후 절차에 대해 설명합니다.

    project/plugin.sbt 설정



    패키지화에 sbt-native-packager 를 사용하기 때문에 project/plugin.sbt 에 이하 추기했습니다.

    project/plugin.sbt
    addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.6")
    

    build.sbt 설정



    중요한 build.sbt 설정은 다음과 같이 설정했습니다.
    내용은 코멘트를 참조하십시오.

    build.sbt
    libraryDependencies ++= Seq(
      "com.typesafe.akka" %% "akka-http" % "10.1.7",
      "com.typesafe.akka" %% "akka-stream" % "2.5.21" // or whatever the latest version is
    )
    
    lazy val root = (project in file(".")).
      enablePlugins(JavaAppPackaging, DockerPlugin, JavaServerAppPackaging, RpmPlugin)
      .settings(
        organization := "com.example",
        scalaVersion := "2.12.7",
        name := "AkkaHttpQuick"
      )
      .settings(
        // Dockerのimageにパッケージング化するための設定
        version in Docker := "1.0", // imageのバージョン
        packageName in Docker := "akka-http-server", // imageの名前
        dockerBaseImage := "java:openjdk-8-jdk", // image生成元のimage
        dockerRepository := Some("chocomint-kusoyaro"), // レジストリ名
        dockerExposedPorts := Seq(8080) // 公開するport
      )
      .settings(
        // RPMにパッケージング化するための設定
        packageName in Rpm := "akka-http-server", // rpmの名前
        version in Rpm := "0.1", // rpmのバージョン
        rpmRelease := "1", // rpmのリリースバージョン
        packageSummary := "Akka Http Server", // rpmのサマリ
        packageDescription := "Simple Akka Http Quickstart", // rpmのディスクリプテョン  
        rpmVendor := "chocomint-kusoyaro", // rpmのベンダ
        rpmUrl := Some("http://chocomint-kusoyaro.com"),
        rpmLicense := Some("MIT")
      )
    

    엔드포인트 웹 서버 코딩



    프로젝트의 끝점이 될 웹 서버를 코딩합니다.
    이번에는 Docker, Rpm으로 시작하기 때문에 엔드포인트는 프로젝트에 하나여야 합니다.
    생각해 보면 당연합니다만, 나는 빠졌으므로 주의해 주세요.

    소스는 다음 AkkaHttp의 Introduction에서 적절하게 가져왔습니다.
    IP 주소에서만 변경하고 있습니다.

    [AkkaHttp Introduction]
    htps // c c. 어? 이오/도 cs/아카-h tp/쿤 t/인 t로즈 c 치온. HTML

    WebServer.scala
    package com.example
    
    import akka.actor.ActorSystem
    import akka.http.scaladsl.Http
    import akka.http.scaladsl.model._
    import akka.http.scaladsl.server.Directives._
    import akka.stream.ActorMaterializer
    import scala.io.StdIn
    
    object WebServer {
      def main(args: Array[String]) {
    
        implicit val system = ActorSystem("my-system")
        implicit val materializer = ActorMaterializer()
        // needed for the future flatMap/onComplete in the end
        implicit val executionContext = system.dispatcher
    
        val route =
          path("hello") {
            get {
              complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>"))
            }
          }
    
        // ここだけ「127.0.0.1」から「0.0.0.0」に変更した。
        val bindingFuture = Http().bindAndHandle(route, "0.0.0.0", 8080)
    
        println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
        StdIn.readLine() // let it run until user presses return
        bindingFuture
          .flatMap(_.unbind()) // trigger unbinding from the port
          .onComplete(_ => system.terminate()) // and shutdown when done
      }
    }
    

    참고로 프로젝트의 구성은 아래 그림과 같이 되어 있다고 생각합니다.



    여기까지, 설정은 완료했으므로, 이후는 Docker의 이미지의 작성, Rpm의 작성에 대해 기재합니다.

    sbt로 Docker 이미징 ~ 소통 확인



    Docker의 이미징에 대해 설명합니다.

    이미지 만들기



    다음 sbt 명령으로 Docker 이미지를 만듭니다.
    $ sbt docker:publishLocal
    ...
    [success] Total time: 11 s, completed 2019/03/03 19:06:33
    

    이미지를 만들었는지 확인합니다.
    $ docker images
    
    REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
    chocomint-kusoyaro/akka-http-server             1.0                 69e7c5f9c55c        47 seconds ago      665MB
    

    컨테이너 시작



    포트를 8080번으로 공개하고 있으므로, 아래와 같이 기동합니다.
    Scala 소스 코드를 보면 알 수 있습니다만, -d 로 백그라운드 프로세스로서의 기동은 이번 할 수 없게 되어 있습니다.
    $ docker run -it -p 8080:8080 chocomint-kusoyaro/akka-http-server:1.0
    
    Server online at http://localhost:8080/
    Press RETURN to stop...
    

    마지막으로 소통 확인합니다.
    아래와 같이 표시되면 성공입니다.
    $ curl -XGET localhost:8080/hello
    
    <h1>Say hello to akka-http</h1>
    

    sbt로 그대로 레지스트리에 등록하고 싶다면


    sbt docker:publish 명령으로 가능합니다.
    $ docker login
    $ sbt docker:publish
    

    다음 명령과 동일합니다.
    $ docker login
    $ docker push chocomint-kusoyaro/akka-http-server:1.0
    

    sbt에서 Rpm 만들기 ~ 소통 확인



    Rpm화 하는 경우는, 이하의 순서를 참고해 주세요.

    rpm 설치



    Mac에서 rpmbuild 명령이 없으면 rpm화 할 수 없었기 때문에 rpm를 Homebrew로 설치했습니다.
    $ brew install rpm
    

    Rpm 만들기



    sbt 명령으로 Rpm을 만듭니다.
    $ sbt rpm:packageBin
    ...
    [success] Total time: 8 s, completed 2019/03/03 19:17:19
    

    성공하면 target/rpm/RPMS/noarch/ 아래에 akka-http-server-0.1-1.noarch.rpm 가 만들어져 있어야 합니다.
    $ ls target/rpm/RPMS/noarch
    akka-http-server-0.1-1.noarch.rpm
    

    Rpm 설치



    어딘가 적당한 서버에 상기에서 작성한 akka-http-server-0.1-1.noarch.rpm 를 가져가서 인스톨 합니다. 설치에는 Java8이 필요하므로 설치되어 있지 않은 경우 설치해 둡니다.
    $ sudo rpm -ivh akka-http-server-0.1-1.noarch.rpm
    
    Preparing...                          ################################# [100%]
    Creating system group: akkahttpquick
    Creating system user: akkahttpquick in akkahttpquick with akkahttpquick user-daemon and shell /bin/false
    Updating / installing...
       1:akka-http-server-0.1-1           ################################# [100%]
    

    그런 다음 시작합니다.build.sbtname := "AkkaHttpQuick" 로 설정한 부분이 커맨드에 반영되는 것처럼, 다음의 커멘드로 기동합니다.
    $ akkahttpquick
    

    마지막으로 소통 확인해 둡니다.
    $ curl http://llhost:8080/hello
    <h1>Say hello to akka-http</h1>
    

    좋은 웹페이지 즐겨찾기