我有一个Play应用程序(使用Scala构建),试图在Docker容器上运行。
以下是我用来启动容器以运行sbt命令的docker-compose.yml和build.sbt的部分。
↓docker-compose.yml
version: '3.7'
services:
service-name:
entrypoint: >
sh -c 'cd /root/project_dir && sbt service/run'
volumes:
- ./project:/root/project_dir/project
- ./service_src:/root/project_dir/service_src
- ./build.sbt:/root/project_dir/build.sbt
- ./.ivy2/:/root/.ivy2/
- ./.sbt/:/root/.sbt/
↓build.sbt
lazy val service = project
.in(file("./service_src"))
:
)
使用此设置启动容器时,由于某种原因,我最终遇到以下错误
[error] java.nio.file.NoSuchFileException: /root/.ivy2/cache/org.webjars.npm/wrappy/jars/wrappy-1.0.2.jar
实际上存在于缓存中。
我应该在哪里弄清楚是什么原因引起的?
更新:
通过观察,我发现在容器中挂载Windows主机目录似乎是造成此问题的原因。
通过挂载,而不是通过docker copy
复制文件/目录,消除了错误...
如何使用卷实现相同的目标,或者这是无法完成的事情?
答案 0 :(得分:2)
您无需复制.sbt
和.ivy2
目录。
我建议使用sbt native packager,以便为您创建图像,而不是重新发明轮子:
将addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.18")
添加到名为project/plugins.sbt
的文件中。
然后在您的build.sbt
中将.enablePlugins(JavaAppPackaging, DockerPlugin)
添加到您的项目中:
lazy val service = project
.in(file("./service_src"))
:
).enablePlugins(JavaAppPackaging, DockerPlugin)
您可以使用sbt配置更改图像设置:
dockerExposedPorts := Seq(9000)
dockerBaseImage := "openjdk:8-jre"
version in Docker := "1.0.0"
要在计算机上构建映像,请运行sbt docker:publishLocal
。
您可以通过运行sbt docker:stage
来查看创建的docker映像。
请参阅the documentation以获取更多帮助,或在此处询问。
如果要与Alpine(轻量级Linux发行版)一起运行应用,请参见Alpine section。
答案 1 :(得分:1)
问题可能与docker映像中使用的访问权限有关。
检查文件是否确实存在,并且可以使用bash / shell从容器中手动读取该文件。
docker-compose run service-name sh
或者如果容器正在运行
docker-compose exec service-name sh
这应该产生sh
命令行并运行
ls -al /root/.ivy2/cache/org.webjars.npm/wrappy/jars/wrappy-1.0.2.jar
检查文件是否存在以及为其分配了哪些权限。
如果权限不是问题,请在容器的外壳内进行调试。