为啥我的 Play Framework for Scala 应用程序的 Docker 映像没有以 AccessDeniedException 开头?

Posted

技术标签:

【中文标题】为啥我的 Play Framework for Scala 应用程序的 Docker 映像没有以 AccessDeniedException 开头?【英文标题】:Why is my Docker image of my Play Framework for Scala app not starting with an AccessDeniedException?为什么我的 Play Framework for Scala 应用程序的 Docker 映像没有以 AccessDeniedException 开头? 【发布时间】:2019-10-02 19:40:28 【问题描述】:

问题

我的项目使用sbt docker:publishsbt docker:publishLocal 构建得很好,但是当我运行映像时,它会失败并显示以下堆栈跟踪:

eleanor@demo-machine:~/workbench/opendar/opendar$ docker run eholley/opendar:1.0-SNAPSHOT
Oops, cannot start the server.
java.nio.file.AccessDeniedException: /opt/docker/RUNNING_PID
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
        at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
        at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:434)
        at java.nio.file.Files.newOutputStream(Files.java:216)
        at play.core.server.ProdServerStart$.createPidFile(ProdServerStart.scala:136)
        at play.core.server.ProdServerStart$.start(ProdServerStart.scala:43)
        at play.core.server.ProdServerStart$.main(ProdServerStart.scala:25)
        at play.core.server.ProdServerStart.main(ProdServerStart.scala)
eleanor@demo-machine:~/workbench/opendar/opendar$ 

复制

该图像在 DockerHub 上的 eholley/opendar:1.0-SNAPSHOT 下是公开的。 (在运行命令中,我省略了几个环境变量,所以预期的输出应该是基于 application.conf 的配置失败,而不是上面的错误。)

如果您想尝试自己构建和打包,可以克隆https://0x00F3@bitbucket.org/0x00F3/opendar.git。

我尝试过的

这个问题与this issue 并没有完全不同,所以我在黑暗中尝试添加这个

import com.typesafe.sbt.packager.docker.DockerChmodType
dockerChmodType := DockerChmodType.UserGroupWriteExecute

根据线程中的建议。它似乎没有改变任何东西。

背景

Ubuntu 版本 18.04.2 LTS Java版openjdk 1.8.0_191 sbt 版本 1.2.1 Scala 版本 2.12.6 sbt-native-packager 版本 1.3.21 Play 框架版本 2.6.20

【问题讨论】:

更新:通过在 application.conf 中设置 play.server.pidfile.path=/dev/null 来解决此问题,但我将问题留给真正的答案。 这才是真正的答案????由于历史原因,playframework 有自己的 PID 文件处理,这在容器环境中是不必要的。 【参考方案1】:

我必须同时添加:

build.sbt

Universal / javaOptions ++= Seq(
  "-Dpidfile.path=/dev/null"
)

conf/application.conf

play.server.pidfile.path=/dev/null

【讨论】:

应该选这个作为这个问题的答案【参考方案2】:

这个问题已经注意到并且在 github 上的各种存储库中都有一些问题 https://github.com/lightbend/sbt-reactive-app/issues/177

您可以像其他人建议的那样将 pid 文件指向 /dev/null,或者如果您使用更高版本的 sbt 本机打包程序,您可以通过 sbt 设置为 docker 用户设置权限

dockerChmodType := DockerChmodType.UserGroupWriteExecute

【讨论】:

以上是关于为啥我的 Play Framework for Scala 应用程序的 Docker 映像没有以 AccessDeniedException 开头?的主要内容,如果未能解决你的问题,请参考以下文章

在play framework 1.2.x, class JPABase分析中,为啥要调用saveAndCascade()?

使用 Play Framework for Java,如何从控制器返回 500 响应?

未解决的依赖关系 sbt with play framework

Play Framework,RAW 字段无法正常工作

Play Framework 2.0 中公共字段的使用

在 Play Framework 2.3.8 中使用 SORM