【发布时间】:2020-10-24 14:51:10
【问题描述】:
我正在尝试 dockerize Play 2.8 Scala 应用程序。我按照文档 (https://www.playframework.com/documentation/2.8.x/Deploying) 中的说明和生成的目标 (sbt clean & sbt dist)。当我使用命令从提取的 zip 运行应用程序时:
sudo ./commentapi -Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b
一切正常,但是当我尝试使用 Postman 与我的 REST API 通信时,我收到以下响应:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Not Found</title>
<style type="text/css">
html,
body,
pre {
margin: 0;
padding: 0;
font-family: Monaco, 'Lucida Console', monospace;
background: #ECECEC;
}
h1 {
margin: 0;
background: #AD632A;
padding: 20px 45px;
color: #fff;
text-shadow: 1px 1px 1px rgba(0, 0, 0, .3);
border-bottom: 1px solid #9F5805;
font-size: 28px;
}
p#detail {
margin: 0;
padding: 15px 45px;
background: #F6A960;
border-top: 4px solid #D29052;
color: #733512;
text-shadow: 1px 1px 1px rgba(255, 255, 255, .3);
font-size: 14px;
border-bottom: 1px solid #BA7F5B;
}
</style>
</head>
<body>
<h1>Not Found</h1>
<p id="detail">
For request 'POST /comments'
</p>
</body>
</html>
当我打开 routes.config 文件时,路由就在那里。此外,当我直接从 IntelliJ 运行我的应用程序时,一切正常。我想这是否可能是数据库连接的问题,因为我使用的是 Slick,并且由于某种原因,如果数据库没有运行,我的应用程序不会崩溃。但这会很奇怪,因为在这种情况下,我应该得到一个异常或一些关于数据库未运行的信息。
如果您知道更简单的 dockerize play 应用程序的方法,我也将不胜感激有关该主题的任何建议。
build.sbt:
name := """commentapi"""
organization := "maciej"
version := "1.0"
lazy val root = (project in file(".")).enablePlugins(PlayScala)
scalaVersion := "2.13.2"
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
artifact.name + "." + artifact.extension
}
libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.slick" %% "slick" % "3.3.2"
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % "3.3.2"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.14"
routesImport += "constants.SortingOrder.Order"
dockerExposedPorts in Docker := Seq(9000, 9443)
// Adds additional packages into Twirl
//TwirlKeys.templateImports += "maciej.controllers._"
// Adds additional packages into conf/routes
// play.sbt.routes.RoutesKeys.routesImport += "maciej.binders._"
routes.config:
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
POST /comments controllers.CommentController.createComment()
PUT /comments/:id controllers.CommentController.updateComment(id: Long)
DELETE /comments/:id controllers.CommentController.deleteComment(id: Long)
GET /comments controllers.CommentController.getAllComments(order: Option[Order], filter: Option[String], prefix: Option[String])
application.conf:
play.http.secret.key="QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n"
play.server.pidfile.path=/dev/null
db {
driver: "slick.jdbc.PostgresProfile$"
db {
url = "jdbc:postgresql://localhost/commentapp"
user = maciej
password = admin
driver = org.postgresql.Driver
maxThreads = 5
}
}
hosts {
allowed = "localhost:9000"
}
【问题讨论】:
-
您也可以发布服务器端日志吗?在生产模式下,Play 不会向客户端返回异常信息(出于安全原因),因此服务器日志中可能会有更多详细信息。
-
@TimMoore 我在本地运行它并且没有日志。启动应用程序时,终端中直接只有一些标准日志:
2020-07-04 12:26:05 INFO play.api.Play Application started (Prod) (no global state) 2020-07-04 12:26:05 INFO play.core.server.AkkaHttpServer Listening for HTTP on /0:0:0:0:0:0:0:0:9000 -
@Maciej_97 - 你能把 allowed 设置为 allowed = ["."] 再试一次吗?
标签: scala playframework sbt sbt-native-packager