项目中需要将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"