sbt本机打包程序scala play dockerfile未使用默认配置运行

sbt本机打包程序scala play dockerfile未使用默认配置运行,scala,docker,playframework,dockerfile,sbt-native-packager,Scala,Docker,Playframework,Dockerfile,Sbt Native Packager,我正在尝试使用sbt原生打包程序为我的Scala play应用程序生成Docker映像,我遵循了中描述的步骤 这是我的配置: 在my plugins.sbt上,我添加了sbt native packager的依赖项: // SBT Native addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.2.1") 在我的build.sbt上,我添加了Universal和Docker的插件: .enablePlugins(PlayS

我正在尝试使用sbt原生打包程序为我的Scala play应用程序生成Docker映像,我遵循了中描述的步骤

这是我的配置:

在my 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容器实例中创建文件夹

并浏览该文件夹,以便play创建PID文件


如何修复上述错误?

启动docker映像时的错误消息是什么?如何启动

还有几个值得注意的事情

与本机打包机一起玩 你不需要添加任何插件,只需要配置docker相关的东西。您已经链接了包格式docker的正确文档

原型与格式 如果没有play插件,您的配置将无法工作。看一看,它解释了如何配置一个简单的应用程序构建

我还建议您阅读此处的格式和原型部分:

本地docker构建 Native packager当前生成两个docker文件,这很容易混淆且不相关。很抱歉让你感到困惑。我们计划删除多余的docker文件。 只需深入一层并运行docker build命令

希望有帮助,
Muki

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