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,如何指定自定义阶段目录