scala - Play 应用的生产版本中的“未找到操作”
问题描述
我正在尝试对 Play 2.8 Scala App 进行 dockerize 处理。我按照文档(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 应用程序的方法,我也将不胜感激有关该主题的任何建议。
构建.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._"
路线配置:
# 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])
应用程序.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 Framework 2.8 (Java) 中遇到了同样的问题。问题出在 .Dockerfile 上。我忘记将播放的“/public”文件夹复制到容器中。并且项目在没有资产的情况下成功构建。(我仍然想知道为什么项目成功构建。在这种情况下它应该失败)。将复制命令“COPY ./public /root/app/public”(请注意您可能有不同的目标文件夹)添加到 .Dockerfile 后,一切都开始工作了。
推荐阅读
- typescript - 如何在打字稿中计算 SMS 消息段?
- python - 使用索引数组中的索引元组索引多维数组 - NumPy / Python
- android - Google play 上的新格式 Bundle 应用怎么样?
- laravel - Laravel - 常量表达式包含 Select distinct 中的无效操作
- c# - 在代码中复制上、下、左、右 UI 选择以用于语音控制
- jenkins - 如何避免 Jenkins 要求在受信任的共享管道中进行调用的进程内批准
- r - R:使用 ggplotly 或 plotly 在工具提示上格式化货币
- stripe-payments - 为什么只能对条带订单使用持续时间“一次”?
- excel - 计算来自不同行的 2 个度量之间的差异
- javascript - 如何从剪贴板粘贴到 Adobe Illustrator 脚本的 javascript 中的字符串?