为啥我的 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:publish
或sbt 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 响应?