首页 > 解决方案 > 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"
}

标签: scalaplayframeworksbtsbt-native-packager

解决方案


我在 Play Framework 2.8 (Java) 中遇到了同样的问题。问题出在 .Dockerfile 上。我忘记将播放的“/public”文件夹复制到容器中。并且项目在没有资产的情况下成功构建。(我仍然想知道为什么项目成功构建。在这种情况下它应该失败)。将复制命令“COPY ./public /root/app/public”(请注意您可能有不同的目标文件夹)添加到 .Dockerfile 后,一切都开始工作了。

码头工人文件


推荐阅读