sbt-native-packager scala 播放 dockerfile 未使用默认配置运行

Posted

技术标签:

【中文标题】sbt-native-packager scala 播放 dockerfile 未使用默认配置运行【英文标题】:sbt-native-packager scala play dockerfile not running with default config 【发布时间】:2018-01-27 11:43:07 【问题描述】:

我正在尝试使用 sbt-native-packager 生成我的 Scala 播放应用程序的 Docker 映像,我按照http://www.scala-sbt.org/sbt-native-packager/formats/docker.html 中描述的步骤进行操作

这是我的配置:

在我的 plugins.sbt 上,我添加了 sbt native packager 的依赖项:

// SBT Native
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.2.1")

在我的 build.sbt 中,我添加了 Universal 和 Docker 的插件:

.enablePlugins(PlayScala, JavaAppPackaging)

我还添加了一些额外的属性:

javaOptions in Universal ++= Seq(
  // JVM memory tuning
  "-J-Xmx1024m",
  "-J-Xms512m",

  // Since play uses separate pidfile we have to provide it with a proper path
  // name of the pid file must be play.pid
  s"-Dpidfile.path=/var/run/$packageName.value/play.pid",

  // Use separate configuration file for production environment
  s"-Dconfig.file=/usr/share/$packageName.value/conf/production.conf",

  // Use separate logger configuration file for production environment
  s"-Dlogger.file=/usr/share/$packageName.value/conf/logback.xml"
)

// exposing the play ports
dockerExposedPorts in Docker := Seq(9000, 9443)

然后我使用插件和 SBT CLI 生成 docker 镜像:

docker:publishLocal

dockerfile 在 ./target/docker/Dockerfile 生成

当我检查我看到的文件时:

FROM openjdk:latest
WORKDIR /opt/docker
ADD opt /opt
RUN ["chown", "-R", "daemon:daemon", "."]
USER daemon
ENTRYPOINT ["bin/root"]
CMD []

它似乎不包含运行应用程序的所有必要步骤,当我使用docker build . 时,我得到:

java.nio.file.NoSuchFileException: /var/run/root/play.pid

似乎 Dockerfile 缺少一些应该 mkdir /var/run/APP_NAME/ 的步骤 (* 在 docker 容器实例中创建文件夹)

并 chown 该文件夹以便播放创建 PID 文件。

如何解决上述错误?

【问题讨论】:

【参考方案1】:

启动docker镜像时的错误信息是什么,如何启动?

还有一些值得注意的事情。

play 自带原生打包器

您不必添加任何插件,而只需配置 docker 相关的东西。您已经为包 format ( docker ) 链接了正确的文档。

原型与格式

如果没有播放插件,您的配置将无法运行。看看http://www.scala-sbt.org/sbt-native-packager/archetypes/java_app/index.html,它解释了如何配置一个简单的应用程序构建。

我还建议您阅读此处的格式和原型部分: http://www.scala-sbt.org/sbt-native-packager/introduction.html#archetype-plugins

本地 docker 构建

Native-packager 目前会生成两个 docker 文件,这很容易混淆并且不相关。很抱歉造成这种混乱。我们计划删除多余的 docker 文件。 只需更深入一层并运行 docker build 命令。

希望对您有所帮助, 渚

【讨论】:

感谢您提供更多信息。我确实查看了您的链接,但我遇到了一个问题,即我的 play 应用程序无法开箱即用,我在上面添加了更多详细信息,并遵循了您的建议,似乎 sbt-native-packager 生成的图像缺少步骤它在哪里创建文件夹 /var/run/app_name/ (PID 文件)我需要将这些步骤作为自定义字段添加到我的 build.sbt 中吗? Dockerfile 试图创建一个 /var/run/$packageName.value/ 文件夹并被拒绝,所以我相信它应该以 root 身份运行?对以上问题有什么建议吗?谢谢。 您可以通过将 pid 文件设置为 /dev/null 来禁用它。它记录在播放应用程序中。在 docker 中使用 pid 文件是没有意义的。

以上是关于sbt-native-packager scala 播放 dockerfile 未使用默认配置运行的主要内容,如果未能解决你的问题,请参考以下文章

scala-library-2.10.3.jar 与 sbt-native-packager 0.7+ 的重复映射

Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?

Scala - SBT - sbt-native-packager - 保留 `stage` 目录的内容

Scala SBT - sbt-native-packager,如何指定自定义阶段目录

如何为 appJS/appJVM 交叉构建项目运行 scala sbt-native-packager

Sbt-Native-Packager 控制文件与 .deb 创建的名称不一致