如何通过使用sbt-docker或者手动编写docker文件在docker中运行sbt项目?

人气:258 发布:2022-09-21 标签: scala docker sbt playframework

问题描述

我一直在努力学习在码头工厂里运行一个sbt项目。我也想用喷雾。 我按照sbt-docker在github中提供的例子: https://github.com/marcuslonnberg/sbt-docker/tree/master/examples/package-spray 当我拖动项目时,它可以正常运行,我可以运行Docker容器。

在project> project> PackageSprayBuild.scala 中有一个文件我不知道这个文件是如何被使用的。 此外,给定的示例没有一个plugins.sbt文件。

然后我试图创建我单独的项目。

我的 plugins.sbt 如下所示:

  logLevel:=级别。  addSbtPlugin(se.marcuslonnberg%sbt-docker%1.2.0)  

我的 build.sbt 看起来与上面提到的示例几乎相同。

  name:=demo-docker-sbt  version:=1.0  scalaVersion:=2.11.7  resolvers + =spray repoathttp://repo.spray.io/  libraryDependencies ++ = Seq(io.spray%spray-can%1.2.0,io.spray%spray-routing%1.2.0 com.typesafe.akka%%akka-actor%2.2.3)  enablePlugins(DockerPlugin)  //使docker依赖在包任务上生成一个应用程序代码的jar文件 docker< = docker.dependsOn(Keys.`package`.in(Compile,packageBin))  /在Docker中定义一个Dockerfile  dockerfile:= { val jarFile = artifactPath.in(Compile,packageBin).value  val classpath =(Compile中的managedClasspath).value  val mainclass = mainClass.in(Compile,packageBin).value.get  val libs =/ app / libs val jarTarget =/ app /+ jarFile.name   new Dockerfile { //使用包含Java $ b $的基本映像b从(java) //暴露端口8080  exposed(8080)  //将所有依赖关系复制到临时目录中的'libs' classpath .files.foreach {depFile =>  val target = file(libs)/ depFile.name  stageFile(depFile,target)}  //从 addRaw添加libs dir(libs, libs)  //添加生成的jar文件 add(jarFile,jarTarget) //类路径是'libs'目录和生成的jar文件 val classpathString = s$ libs / *:$ jarTarget //使用主类设置入口点 cmd(java,-cp,classpathString,mainclass) } }   

然后我进入项目内的终端,使用命令sbt docker然后它给了我以下错误:

  [info]解析com.typesafe.akka# akka-actor_2.11; 2.2.3 ...  [warn] module not found:com.typesafe.akka#akka-actor_2.11; 2.2.3  [warn] ==== local :尝试 [warn] /home/admin/.ivy2/local/com.typesafe.akka/akka-actor_2.11/2.2.3/ivys/ivy.xml  [warn] === = jcenter:试过 [warn] https://jcenter.bintray.com/com/typesafe/akka/akka-actor_2.11/2.2.3/akka-actor_2.11-2.2.3.pom  [warn] ==== public:尝试 [warn] https://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.11/2.2.3/akka-actor_2.11-2.2.3.pom  [warn] ==== spray repo:试过 [warn] http://repo.spray.io/com/typesafe/akka/akka-actor_2.11/2.2.3/akka-actor_2.11 -2.2.3.pom  [info]解决jline#jline; 2.12.1 ...  [warn] :::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: com.typesafe.akka#akka-actor_2.11; 2.2.3:not found  [warn] :::::::::::::::::::::::: ::::::::::::::::::::::::  [warn]  [warn]注意:未解决的依赖项路径: [warn] com.typesafe.akka:akka-actor_2.11:2.2.3(/home/admin/IdeaProjects/demo-docker-sbt/build.sbt#L11-15) [warn] +  - 默认值:demo- docker-sbt_2.11:1.0  sbt.ResolveException:unresolved de pendency:com.typesafe.akka#akka-actor_2.11; 2.2.3:未找到 at sbt.IvyActions $ .sbt $ IvyActions $$ resolve(IvyActions.scala:291) at sbt。 IvyActions $$ anonfun $ updateEither $ 1.apply(IvyActions.scala:188) at sbt.IvyActions $$ anonfun $ updateEither $ 1.apply(IvyActions.scala:165) at sbt.IvySbt $ Module $ $ anonfun $ withModule $ 1.apply(Ivy.scala:155) at sbt.IvySbt $ Module $$ anonfun $ withModule $ 1.apply(Ivy.scala:155) at sbt.IvySbt $$ anonfun $ withIvy $ 1.apply(Ivy.scala:132) at sbt.IvySbt.sbt $ IvySbt $$ action $ 1(Ivy.scala:57) at sbt.IvySbt $$ anon $ 4.call Ivy.scala:65) at xsbt.boot.Locks $ GlobalLock.withChannel $ 1(Locks.scala:93) at xsbt.boot.Locks $ GlobalLock.xsbt $ boot $ Locks $ GlobalLock $$ withChannelRetries $ 1(Locks.scala:78) at xsbt.boot.Locks $ GlobalLock $$ anonfun $ withFileLock $ 1.apply(Locks.scala:97) at xsbt.boot.Using $ .withResource(使用.scala:10)在xsbt.boot.Using $ .apply(Using.scala:9)在xsbt.boot.Lo cks $ GlobalLock.ignoringDeadlockAvoided(Locks.scala:58) at xsbt.boot.Locks $ GlobalLock.withLock(Locks.scala:48) at xsbt.boot.Locks $ .apply0(Locks.scala :31) at xsbt.boot.Locks $ .apply(Locks.scala:28) at sbt.IvySbt.withDefaultLogger(Ivy.scala:65) at sbt.IvySbt.withIvy (Ivy.scala:127) at sbt.IvySbt.withIvy(Ivy.scala:124) at sbt.IvySbt $ Module.withModule(Ivy.scala:155) at sbt。 IvyActions $ .updateEither(IvyActions.scala:165) at sbt.Classpaths $$ anonfun $ sbt $ Classpaths $$ work $ 1 $ 1.apply(Defaults.scala:1369) at sbt.Classpaths $$ anonfun $ sbt $ Classpaths $$ work $ 1 $ 1.apply(Defaults.scala:1365) at sbt.Classpaths $$ anonfun $ doWork $ 1 $ 1 $$ anonfun $ 87.apply(Defaults.scala:1399) at sbt.Classpaths $$ anonfun $ doWork $ 1 $ 1 $$ anonfun $ 87.apply(Defaults.scala:1397) at sbt.Tracked $$ anonfun $ lastOutput $ 1.apply(Tracked.scala:37) at sbt.Classpaths $$ anonfun $ doWork $ 1 $ 1.apply(Defaults.scala:1402) at sbt.Clas spaths $$ anonfun $ doWork $ 1 $ 1.apply(Defaults.scala:1396) at sbt.Tracked $$ anonfun $ inputChanged $ 1.apply(Tracked.scala:60) at sbt.Classpaths $。 cachedUpdate(Defaults.scala:1419) at sbt.Classpaths $$ anonfun $ updateTask $ 1.apply(Defaults.scala:1348) at sbt.Classpaths $$ anonfun $ updateTask $ 1.apply(默认值) scala:1310) at scala.Function1 $$ anonfun $ compose $ 1.apply(Function1.scala:47) at sbt $ tilde $ greater $$ anonfun $$ u2219 $ 1.apply(TypeFunctions。 scala:40) at sbt.std.Transform $$ anon $ 4.work(System.scala:63) at sbt.Execute $$ anonfun $ submit $ 1 $$ anonfun $ apply $ 1.apply Execute.scala:226) at sbt.Execute $$ anonfun $ submit $ 1 $$ anonfun $ apply $ 1.apply(Execute.scala:226) at sbt.ErrorHandling $ .wideConvert(ErrorHandling.scala :17) at sbt.Execute.work(Execute.scala:235) at sbt.Execute $$ anonfun $ submit $ 1.apply(Execute.scala:226) at sbt。执行$$ anonfun $ submit $ 1.apply(Execute.scala:226) at sbt.ConcurrentRestr谜$ anon $ 4 $$ anonfun $ 1.apply(ConcurrentRestrictions.scala:159) at sbt.CompletionService $$ anon $ 2.call(CompletionService.scala:28) at java.util.concurrent。 FutureTask.run(FutureTask.java:266)在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)在java.util.concurrent.FutureTask.run(FutureTask。 java:266)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) [error](*:update)sbt.ResolveException:未解析的依赖关系:com.typesafe.akka#akka-actor_2.11; 2.2。 3:找不到  

问题:

1)。应该在这里使用什么版本的akka​​,以及在docker容器内正确运行sbt项目时我缺少什么东西?有没有什么我需要改变我的build.sbt码头配置?

我的sbt是0.13.8,scala 2.11.7

2)示例项目中的PackageSprayBuild.scala文件的使用是什么,为什么没有使用plugins.sbt文件?

3 )。是否有必要,我还必须在sbt项目之前定义一个主类,然后在项目的docker内部构建映像。或者我可以通过提供build.sbt和plugins.sbt配置来简单地构建一个图像?

4)。如果我想在不使用sbt-native-packager或sbt-docker或sbt-assembly的情况下手动构建我的sbt项目的docker映像,那么将是什么样的docker文件?我已经阅读了dockerfile参考,但是不能准确地了解如何为sbt项目特别定义一个docker文件。一个例子将非常有用,显示建立图像以及该Docker文件的内容的命令。

5)。在docker容器中运行sbt项目似乎有多种方式。这将是实现它的最佳方法,为什么? 我想使用sbt与喷雾/播放框架,并运行它在许多容器。

我正在使用Lubuntu操作系统。

解决方案

DockerPlugin 从 SBT Native Packager插件

I have been trying to learn to run a sbt project in docker. I also want to use spray. I am following the example provided by sbt-docker in github: https://github.com/marcuslonnberg/sbt-docker/tree/master/examples/package-spray When i pull the project, it works fine and i could run the docker container as well.

There is a file inside project > project > PackageSprayBuild.scala I dont know how this file is being used. Also, the the given example doesnt have a plugins.sbt file.

Then i tried to create my separate project.

my plugins.sbt looks like this:

logLevel := Level.Warn

addSbtPlugin("se.marcuslonnberg" % "sbt-docker" % "1.2.0")

my build.sbt looks almost identical to that of the example i mentioned above.

name := "demo-docker-sbt"

version := "1.0"

scalaVersion := "2.11.7"

resolvers += "spray repo" at "http://repo.spray.io/"

libraryDependencies ++= Seq(
  "io.spray" % "spray-can" % "1.2.0",
  "io.spray" % "spray-routing" % "1.2.0",
  "com.typesafe.akka" %% "akka-actor" % "2.2.3")

enablePlugins(DockerPlugin)

// Make docker depend on the package task, which generates a jar file of the application code
docker <<= docker.dependsOn(Keys.`package`.in(Compile, packageBin))

// Define a Dockerfile
dockerfile in docker := {
  val jarFile = artifactPath.in(Compile, packageBin).value
  val classpath = (managedClasspath in Compile).value
  val mainclass = mainClass.in(Compile, packageBin).value.get
  val libs = "/app/libs"
  val jarTarget = "/app/" + jarFile.name

  new Dockerfile {
    // Use a base image that contain Java
    from("java")
    // Expose port 8080
    expose(8080)

    // Copy all dependencies to 'libs' in the staging directory
    classpath.files.foreach { depFile =>
      val target = file(libs) / depFile.name
      stageFile(depFile, target)
    }
    // Add the libs dir from the
    addRaw(libs, libs)

    // Add the generated jar file
    add(jarFile, jarTarget)
    // The classpath is the 'libs' dir and the produced jar file
    val classpathString = s"$libs/*:$jarTarget"
    // Set the entry point to start the application using the main class
    cmd("java", "-cp", classpathString, mainclass)
  }
}

Then i went into the terminal, inside the project and used command, "sbt docker" and then it gave me the following error:

[info] Resolving com.typesafe.akka#akka-actor_2.11;2.2.3 ...
[warn]  module not found: com.typesafe.akka#akka-actor_2.11;2.2.3
[warn] ==== local: tried
[warn]   /home/admin/.ivy2/local/com.typesafe.akka/akka-actor_2.11/2.2.3/ivys/ivy.xml
[warn] ==== jcenter: tried
[warn]   https://jcenter.bintray.com/com/typesafe/akka/akka-actor_2.11/2.2.3/akka-actor_2.11-2.2.3.pom
[warn] ==== public: tried
[warn]   https://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.11/2.2.3/akka-actor_2.11-2.2.3.pom
[warn] ==== spray repo: tried
[warn]   http://repo.spray.io/com/typesafe/akka/akka-actor_2.11/2.2.3/akka-actor_2.11-2.2.3.pom
[info] Resolving jline#jline;2.12.1 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.typesafe.akka#akka-actor_2.11;2.2.3: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn]  Note: Unresolved dependencies path:
[warn]      com.typesafe.akka:akka-actor_2.11:2.2.3 (/home/admin/IdeaProjects/demo-docker-sbt/build.sbt#L11-15)
[warn]        +- default:demo-docker-sbt_2.11:1.0
sbt.ResolveException: unresolved dependency: com.typesafe.akka#akka-actor_2.11;2.2.3: not found
    at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:291)
    at sbt.IvyActions$$anonfun$updateEither$1.apply(IvyActions.scala:188)
    at sbt.IvyActions$$anonfun$updateEither$1.apply(IvyActions.scala:165)
    at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:155)
    at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:155)
    at sbt.IvySbt$$anonfun$withIvy$1.apply(Ivy.scala:132)
    at sbt.IvySbt.sbt$IvySbt$$action$1(Ivy.scala:57)
    at sbt.IvySbt$$anon$4.call(Ivy.scala:65)
    at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:93)
    at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:78)
    at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:97)
    at xsbt.boot.Using$.withResource(Using.scala:10)
    at xsbt.boot.Using$.apply(Using.scala:9)
    at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:58)
    at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:48)
    at xsbt.boot.Locks$.apply0(Locks.scala:31)
    at xsbt.boot.Locks$.apply(Locks.scala:28)
    at sbt.IvySbt.withDefaultLogger(Ivy.scala:65)
    at sbt.IvySbt.withIvy(Ivy.scala:127)
    at sbt.IvySbt.withIvy(Ivy.scala:124)
    at sbt.IvySbt$Module.withModule(Ivy.scala:155)
    at sbt.IvyActions$.updateEither(IvyActions.scala:165)
    at sbt.Classpaths$$anonfun$sbt$Classpaths$$work$1$1.apply(Defaults.scala:1369)
    at sbt.Classpaths$$anonfun$sbt$Classpaths$$work$1$1.apply(Defaults.scala:1365)
    at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$87.apply(Defaults.scala:1399)
    at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$87.apply(Defaults.scala:1397)
    at sbt.Tracked$$anonfun$lastOutput$1.apply(Tracked.scala:37)
    at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:1402)
    at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:1396)
    at sbt.Tracked$$anonfun$inputChanged$1.apply(Tracked.scala:60)
    at sbt.Classpaths$.cachedUpdate(Defaults.scala:1419)
    at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1348)
    at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1310)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[error] (*:update) sbt.ResolveException: unresolved dependency: com.typesafe.akka#akka-actor_2.11;2.2.3: not found

Questions:

1). What version of akka should in use here and what are the things i am missing for properly runnning a sbt project inside a docker container ? Is there something i need to change in my build.sbt docker configuration ?

my sbt is 0.13.8, scala 2.11.7

2) What is the use of that PackageSprayBuild.scala file in the example project, and why is there no plugins.sbt file used ?

3). Is it necessary that i must also define a main class inside the sbt project before the image is build inside the docker for the project ? Or can i simply build an image by providing build.sbt and plugins.sbt configurations ?

4). what would be the sample docker file, if i want to manually build a docker image for my sbt-project without using the sbt-native-packager or sbt-docker or sbt-assembly ? I have read the dockerfile reference, but cant precisely get an idea of how to define a docker file particulary for a sbt project. An example would be extremely helpful showing commands up to building the image as well as the contents of that docker file.

5). There seems to be multiple ways of running the sbt project inside the docker container. Which would be the best approach to achieve it and why ? I want to use sbt with spray/play framework and run it in many containers.

I am using Lubuntu OS.

解决方案

Take a look at DockerPlugin from SBT Native Packager Plugin

187