Docker部署Play Framework应用时配置文件路径错误求助
解决Play Framework Scala应用Docker部署时的"Bad root server path"错误
问题概述
使用Docker部署Play 2.8.19 + Scala生产应用,启动容器时抛出核心错误:
Bad root server path: /opt/docker/-Dconfig.resource=/opt/docker/conf/production.conf
注:附带的is_cygwin: not found提示可忽略,核心问题为JVM配置参数被误识别为服务器根路径。
环境信息
- sbt 1.7.2
- Play Version 2.8.19
- Java 1.8.0_362
- Ubuntu 22.04.2 LTS
错误原因
Play生成的启动脚本会将未被识别的参数默认当作服务器根路径,当前配置直接把JVM参数(-Dconfig.resource=...)放在启动命令后,导致脚本误将其解析为根路径参数,从而触发报错。
解决方案
方式1:构建阶段通过javaOptions注入参数
修改build.sbt,移除dockerEntrypoint中的JVM参数,改用Play原生的javaOptions配置传递:
... Docker / version := sys.env.getOrElse("BUILD_NUMBER", "0") Docker / daemonUserUid := None Docker / daemonUser := "daemon" dockerExposedPorts := Seq(9000) dockerBaseImage := "openjdk:8-jre-alpine" dockerUpdateLatest := true // 注入JVM配置参数 javaOptions in Universal ++= Seq("-Dconfig.resource=/opt/docker/conf/production.conf") // 仅指定启动脚本路径,保留默认参数逻辑 dockerEntrypoint := Seq("/opt/docker/bin/play-scala-seed")
重新执行sbt "Docker / publishLocal"构建镜像,启动脚本会自动加载javaOptions中的参数,不会被误解析。
方式2:运行时通过环境变量传递参数
Play启动脚本支持通过JAVA_OPTS环境变量传递JVM参数,步骤如下:
- 修改
build.sbt,恢复默认启动入口:
dockerEntrypoint := Seq("/opt/docker/bin/play-scala-seed")
- 启动容器时注入环境变量:
docker run --rm -p 9000:9000 -e JAVA_OPTS="-Dconfig.resource=/opt/docker/conf/production.conf" playground-api
验证要点
- 确认容器内
/opt/docker/conf/production.conf文件存在,可通过docker exec <容器ID> ls /opt/docker/conf检查 - 若使用相对路径,因启动脚本位于
/opt/docker/bin/,可改为-Dconfig.resource=../conf/production.conf
内容的提问来源于stack exchange,提问作者edge
相关产品推荐
相关产品推荐

