当前位置: 首页 > 知识库问答 >
问题:

sbt-native-packager for Docker on Mac OS X

谢志用
2023-03-14
enablePlugins(JettyPlugin)
enablePlugins(JavaAppPackaging)
enablePlugins(DockerPlugin)

// for Docker, the "." location where it is looking for files is in target/docker/stage. For the COPY command to work,
// the sbt Docker packager has to know this file resides in ../../scala-2.11 so include this mapping
//mappings in Docker += file("../../scala-2.11/direct2-batch-match_2.11-0.1.0-SNAPSHOT.war") -> "direct2-batch-match_2.11-0.1.0-SNAPSHOT.war"
dockerCommands := Seq(Cmd("FROM","tomcat:8.0.20-jre8"), Cmd("LABEL", """vendor="Dun & Bradstreet" """), Cmd("LABEL", """version="0.0" """), Cmd("EXPOSE", "8080"), Cmd("COPY","direct2-batch-match_2.11-0.1.0-SNAPSHOT.war","webapps/d2bm.war"))

正如您所看到的,我已经注释掉了Docker中的映射。这样做的原因是,如果我将它留在中,它将在target/docker/stage中创建一个与我的war文件同名的空目录(在本例中为direct2-batch-match2.11-0.1.0-snapshot.war)。这允许Dockerfile在docker构建中正常工作,但是war文件的内容不包括在构建中。

我在Mac OS X上运行,我想知道这是否是一个错误,插件试图创建一个指向所需文件的链接,也许Linux的link命令在Mac OS X Sierra上给出了错误的结果。

我需要以不同的方式进行映射吗?还有其他人碰到过这个吗?空目录是在sbt中运行docker:publishLocal时创建的,我使用的是插件版本1.2.0-M9。

在SBT:中运行Docker:PublishLocal的结果:

docker:publishLocal
[info] Updating {file:/Users/cardm/projects/direct2-batch-match/}direct2-batch-match...
[info] Wrote /Users/cardm/projects/direct2-batch-match/target/scala-2.11/direct2-batch-match_2.11-0.1.0-SNAPSHOT.pom
[info] Resolving org.scalatra.scalate#scalate-precompiler_2.11;1.8.0.1 ...
[info] Done updating.
[info] Compiling Templates in Template Directory: /Users/cardm/projects/direct2-batch-match/src/main/webapp/WEB-INF/templates
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[warn] You have no main class in your project. No start script will be generated.
[warn] You have no main class in your project. No start script will be generated.
[info] Sending build context to Docker daemon 74.45 MB
[info] Step 1/5 : FROM tomcat:8.0.20-jre8
[info] ---> e88a065848be
[info] Step 2/5 : LABEL vendor "Dun & Bradstreet"
[info] ---> Using cache
[info] ---> de03acb09377
[info] Step 3/5 : LABEL version "0.0"
[info] ---> Using cache
[info] ---> f4f3e4accacb
[info] Step 4/5 : EXPOSE 8080
[info] ---> Using cache
[info] ---> f971b388dc2c
[info] Step 5/5 : COPY direct2-batch-match_2.11-0.1.0-SNAPSHOT.war webapps/d2bm.war
[info] ---> 60a95c386e23
[info] Removing intermediate container cf15079616cd
[info] Successfully built 60a95c386e23
[info] Built image DockerAlias(None,None,direct2-batch-match,Some(0.1.0-SNAPSHOT))
[success] Total time: 4 s, completed Apr 28, 2017 6:35:09 PM

目标/Docker/Stage的内容:

Mike-Cards-MacBook-Pro:direct2-batch-match cardm$ ls -la target/docker/stage/
total 8
drwxr-xr-x 5 cardm staff 170 Apr 28 18:35 .
drwxr-xr-x 4 cardm staff 136 Apr 28 18:35 ..
-rw-r--r-- 1 cardm staff 156 Apr 28 18:35 Dockerfile
drwxr-xr-x 2 cardm staff 68 Dec 31 1969 direct2-batch-match_2.11-0.1.0-SNAPSHOT.war
drwxr-xr-x 3 cardm staff 102 Apr 28 18:35 opt

正如你所看到的,有些地方不对劲,放一个空目录而不是文件是没有用的,这就是为什么我认为这应该是一个链接。在我的set文件中,如果我使用“mappings In universal”,它会产生相同的结果,一个带有war文件名的空目录。

共有1个答案

弘焕
2023-03-14

大家好,原来问题出在我的sbt文件是如何设置的,特别是“Docker中的映射”部分。我的项目的正确设置如下:

mappings in Docker += file("target/scala-2.11/direct2-batch-match_2.11-0.1.0-SNAPSHOT.war") -> "direct2-batch-match_2.11-0.1.0-SNAPSHOT.war"

这里的诀窍是“源”文件(->的左侧)相对于项目根文件夹,而目标文件(->的右侧)相对于docker staging目录,该目录位于PROJECT ROOT/target/docker/stage中。在我最初的设置中,我假设两个文件路径都相对于Docker staging目录,而在调试sbt-native-packager插件时,我发现这两个路径相对于不同的根位置。

我真的认为Docker的sbt-native-packager文档应该更新以明确这一点。

 类似资料:
  • 我有一个sbt构建,当我从命令行运行时可以工作,但Intellij不喜欢。我的Intellij运行在Linux上,它的版本是14.1.4,我的scala插件是1.5.2。 Intellij抱怨我使用enablePlugins(JavaAppPackaging)。错误是“表达式类型(DslEntry)必须符合SBT文件中的设置[_]”。 我的项目/构建。属性文件: 我的项目/插件。sbt公司 我bu

  • 我尝试使用sbt-native-packager来构建deb包。我想加入debian包的生命周期。我试图根据sbt-native-packager站点上的说明来实现这一点。在我的建筑中.sbt我添加了如下内容: 但我得到错误。我使用sbt 0.13.9、scala 2.11.6和sbt-native-packager 1.0.6。我在包中搜索,找不到类似的东西。我也找不到的键。看来sbt-nati

  • 我已经在plugins.sbt文件中添加了sbt-native-packager,1.3.15版。在build.sbt文件中,我使用了enablePlugins(DockerPligin)。当我在sbt shell上运行以下命令时,遇到以下错误: 错误-->

  • 在实际项目中,linuxPackageMappings相当复杂,这是我的问题。项目之间的差异。当我将build.sbt加载到sbt中时,我得到错误 第53行和第72行标记在上面包含的build.sbt片段I中。 我不知道的事情我在这方面不够熟练,不知道为什么项目有sbt-assembly和sbt-package Manager。我已经对plugins.sbt中的sbt-assembly进行了注释,

  • 我正在使用Scala开发SBT 0.13.6和sbt-native-packager 1.0.0-M3

  • 我正在尝试使用sbt-native-packager生成Scala play应用程序的Docker映像,我遵循了http://www.scala-sbt.org/sbt-native-packager/formats/Docker.html中描述的步骤 这是我的配置: 我还添加了一些额外的属性: 然后使用插件和SBT CLI生成docker映像: dockerfile在./target/docke