Sbt运行命令在Docker容器上失败,并显示“ NoSuchFileException”

时间:2019-02-19 07:15:29

标签: scala docker sbt

我有一个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复制文件/目录,消除了错误...

如何使用卷实现相同的目标,或者这是无法完成的事情?

2 个答案:

答案 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

检查文件是否存在以及为其分配了哪些权限。

如果权限不是问题,请在容器的外壳内进行调试。