【问题标题】:Sbt run command fails with "NoSuchFileException" on Docker containerSbt 运行命令在 Docker 容器上失败并出现“NoSuchFileException”
【发布时间】:2019-07-12 15:00:26
【问题描述】:

我有一个尝试在 Docker 容器上运行的 Play 应用程序(使用 Scala 构建)。

以下是我用来启动容器以运行 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复制文件/目录而不是安装,可以消除错误...

我怎样才能使用卷来达到同样的效果,或者这是无法做到的事情?

【问题讨论】:

    标签: scala docker sbt


    【解决方案1】:

    您无需复制 .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

    【讨论】:

    • 这是解决这个问题的方法,但问题与在 docker 中运行 sbt 有关。这可能发生在 CI 中
    • @dvir 其实我想在一个容器中测试对源代码的改动
    • @d-_-b 我明白了。现在更有意义了。最初您写道,您有一个尝试在容器上运行的播放应用程序。
    【解决方案2】:

    问题可能与 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
    

    检查文件是否存在以及分配给它的权限。

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

    【讨论】:

    • ls -al /root/.ivy2/cache/org.webjars.npm/wrappy/jars/wrappy-1.0.2.jar 输出-rwxr-xr-x 1 root root 4502 Jul 12 2017 /root/.ivy2/cache/org.webjars.npm/wrappy/jars/wrappy-1.0.2.jar。文件权限看起来没问题。我不知道还有什么地方可以研究...
    猜你喜欢
    • 2017-08-15
    • 2017-01-30
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多