我正在使用sbt-本机包程序和sbt来生成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))
)
}发布于 2014-08-06 15:55:31
引用的文章是系列文章的第2部分,其中容器的地址通过脚本传递到Java程序中。脚本本身在第1部分中被引用。
mappings in Universal采用一系列(File, String)元组。将文件复制到由结果图像中的字符串指定的路径。
在这种情况下,如果baseDirectory.value / "docker" / "start"中没有文件,那么就没有什么可复制的,结果就是您描述的行为。
您应该创建一个适当的开始脚本,如第1部分中所讨论的。
发布于 2014-08-06 16:21:38
另一种选择是利用sbt-本机-包装机中对Docker的实验支持。
如果从build.sbt中删除与Docker相关的行,并添加maintainer设置,则可以:
sbt docker:stage在target/docker/stage中生成一个Dockerfile和上下文
sbt docker:publishLocal生成本地图像
sbt docker:publish生成图像并远程推送它
如果要修改传递给start脚本的命令,可以进行如下修改:
bashScriptExtraDefines := Seq(
"CLUSTER_IP=$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')",
"addResidual ${CLUSTER_IP}"
)addResidual是由sbt本机包程序生成的启动脚本中的一个函数,它为程序的命令行参数添加了一个额外的参数。
addJava是一个函数,它向运行程序的Java二进制文件添加一个额外的参数。
您的build.sbt可能如下所示:
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
maintainer := "Dan Ellis <dan@halftreelabs.com>"更多信息可以从sbt本机打包器文档中获得.也欢迎提出意见。
https://stackoverflow.com/questions/25155583
复制相似问题