项目中需要将play框架编写的sbt项目容器化打包,编写Dockerfile比较麻烦,很多sbt的镜像缺乏维护。利用sbt-native-packager https://www.scala-sbt.org/sbt-native-packager/formats/docker.html# 可以更加方便的利用sbt插件直接打包镜像。

如何操作

根据官网描述,第一步需要把以下命令加在sbt项目的project文件夹下的plugins.sbt中

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "x.y.z")

同时在build.sbt中追加:

enablePlugins(JavaAppPackaging)
以及
enablePlugins(DockerPlugin)

然后在项目文件下docker:publishLocal 就完成了

打包playframe可能遇到的问题

打包完成play项目的后,再启动镜像时可能会遇到如下问题

1

    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)

解决方法:

在build.sbt追加

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

在play项目的conf/ application.conf中追加

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

2

[error] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.

解决方法

在conf/application.conf中追加

  • Play 2.5

play.crypto.secret="changethissosomethingsecret"

  • Play 2.6+
    play.http.secret.key="changethissosomethingsecret"