scala - 为什么sbt-native-packager将bin/start登台为目录而不是脚本?

标签 scala sbt docker sbt-native-packager

我正在使用sbt-native-packager和sbt-docker生成this tutorial中描述的Docker镜像。 Docker镜像不会运行(权限被拒绝),经检查发现bin/start被创建为空目录。

dan@cobalt:~/projects/confabulous/deva$ ls -l target/universal/stage/bin/
total 24
-rwxrw-r-- 1 dan dan 11591 Aug  5 20:44 deva
-rw-rw-r-- 1 dan dan  6211 Aug  5 20:44 deva.bat
drwxrwxr-x 2 dan dan  4096 Dec 31  1969 start

由于某种原因,它也有一个空时间戳。为什么将其创建为目录而不是Shell脚本?

这是我的plugins.sbt:
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.4")

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

addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.1")

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

resolvers += Classpaths.sbtPluginReleases

这是我的build.sbt:
import DockerKeys._
import sbtdocker.{Dockerfile, ImageName}
import com.typesafe.sbt.packager.Keys._

organization  := "com.confabulous"

name          := "deva"

version       := "0.0.1"

scalaVersion  := "2.10.3"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-language:postfixOps")

resolvers ++= Seq(
  "sonatype releases"  at "https://oss.sonatype.org/content/repositories/releases/",
  "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/",
  "typesafe repo"      at "http://repo.typesafe.com/typesafe/releases/"
)

libraryDependencies ++= Seq(
  "ch.qos.logback"      %   "logback-classic" % "1.0.9",
  "com.typesafe.akka"   %   "akka-slf4j_2.10" % "2.3.3",
  "com.typesafe.akka"   %%  "akka-actor"      % "2.3.3",
  "com.typesafe.akka"   %%  "akka-remote"     % "2.3.3",
  "com.typesafe.akka"   %%  "akka-agent"      % "2.3.3",
  "com.typesafe.slick"  %%  "slick"           % "2.0.1-RC1",
  "org.mozilla"         %   "rhino"           % "1.7R4",
  "org.postgresql"      %   "postgresql"      % "9.3-1101-jdbc3",
  "org.msgpack"         %%  "msgpack-scala"   % "0.6.8",
  "com.livestream"      %%  "scredis"         % "1.1.2",
  "com.confabulous"     %%  "messages"        % "0.0.1-SNAPSHOT",
  "com.confabulous"     %%  "db"              % "0.0.1-SNAPSHOT"
)

packageArchetype.java_server

sbtdocker.Plugin.dockerSettings

mappings in Universal += baseDirectory.value / "docker" / "start" -> "bin/start"

docker <<= docker.dependsOn(com.typesafe.sbt.packager.universal.Keys.stage.in(Compile))

// Define a Dockerfile
dockerfile in docker <<= (name, stagingDirectory in Universal) map {
    case (appName, stageDir) =>
        val workingDir = s"/opt/${appName}"
        new Dockerfile {
            // Use a base image that contain Java
            from("relateiq/oracle-java7")
            maintainer("Dan Ellis <dan@halftreelabs.com>")
            expose(1600)
            add(stageDir, workingDir)
            run("chmod",  "+x",  s"/opt/${appName}/bin/${appName}")
            run("chmod",  "+x",  s"/opt/${appName}/bin/start")
            workDir(workingDir)
            entryPointShell(s"bin/start", appName, "$@")
        }
}

imageName in docker := {
    ImageName(
        namespace = Some("confabulous.com"),
        repository = name.value
        //,tag = Some("v" + version.value))
    )
}

最佳答案

被引用的文章是该系列的第2部分,其中容器的地址通过脚本传递到Java程序中。脚本本身在part 1中引用。
mappings in Universal采用一系列(File, String)元组。将文件复制到结果图像中由字符串指定的路径。

在这种情况下,如果baseDirectory.value / "docker" / "start"上没有文件,则没有任何内容可复制,结果就是您描述的行为。

您应该创建适当的启动脚本,如第1部分所述。

关于scala - 为什么sbt-native-packager将bin/start登台为目录而不是脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25155583/

相关文章:

java - Spark 作业返回后不久,推测任务是否可以继续运行?

Java/Scala 以类型安全的方式获取 Field 引用

scala - 如何使用 sbt 将 Scala 库发布到 Maven Central?

scala - IntelliJ IDEA 提示 'broken source path' 用于 sbt 驱动的项目

scala - Upstart 的 daemonUser 无法在 sbt-native-packager 中工作

spring - Windows上的Docker,Mongodb,Spring Boot出现连接被拒绝错误

docker - 如何保持无限循环运行以不关闭Docker中的容器

scala - 具有多个参数列表的 Scala 方法中的尾递归

sbt - 如何一起使用 sbt-assembly 和 sbt-aws-plugin? (jarFile 设置 vs 任务冲突)

docker - docker服务如何真正在一台机器上扩展?