【问题标题】:Copy excel (.xls) file to a container using the Dockerfile使用 Dockerfile 将 excel (.xls) 文件复制到容器中
【发布时间】:2019-05-21 07:29:34
【问题描述】:

我对 Docker 还很陌生,所以我的问题可能有一个简单的答案。通过我使用一些在线教程创建的 Dockerfile,我成功地将我的 java 项目集成到一个容器中。现在我想对 .xls 文件做同样的事情。我已经在已经存在的线程中寻找解决方案,但找不到任何解决方案。

一个类使用 .xls 文件为我的应用服务生成信息。 Eveything 工作得很好(这是一个 Spring 应用程序,邮递员和 h2 db 提供了很好的测试) 在这种情况下,我的 Dockerfile 看起来像下面的代码主干。 我只提供我的两只“豚鼠”。 我尝试通过其类型访问 excel 文件的一种方式(jar 文件似乎是通过这种方式访问​​的)。 我也尝试使用文件名进行复制,因为这看起来更自然。 (虽然 Jar 文件本身似乎没有引起任何问题。)

FROM openjdk:8-jre

ARG JAR_FILE

COPY ${JAR_FILE} app.jar

COPY ${XLS_FILE}  test.xls

ENTRYPOINT ["java","-jar", "-Dserver.port=80" , "-Dprofile=prod", "/app.jar"]

FROM openjdk:8-jre

ARG JAR_FILE

COPY ${JAR_FILE} app.jar

COPY ${TaIlagerplatz_KR}  test.xls

ENTRYPOINT ["java","-jar", "-Dserver.port=80" , "-Dprofile=prod", "/app.jar"]

我进行了更多不确定的探索/实验。我有点处于编程极限..:) 我发现第一次尝试时出现“无效或损坏的 jar”错误。 消息内容为

C:\Users\dnorthe\Java Tutorial\RGLVS_BE_Core>docker run test3
Error: Invalid or corrupt jarfile /app.jar

第二个更复杂的错误消息如下:

java.io.FileNotFoundException: build/Data/TaIlagerplatz_KR.xls (No such file or directory)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at de.biere.rglvs.artikelstamm.init.SeedDataArtikelExcel.read(SeedDataArtikelExcel.java:39)
        at de.biere.rglvs.artikelstamm.init.SeedDataArtikelExcel.<clinit>(SeedDataArtikelExcel.java:30)
        at de.biere.rglvs.artikelstamm.init.DataLoaderArtikel.run(DataLoaderArtikel.java:27)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:794)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:324)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
        at de.biere.rglvs.RglvsApplication.main(RglvsApplication.java:23)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
java.io.FileNotFoundException: build/Data/TaIlagerplatz_KR.xls (No such file or directory)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at de.biere.rglvs.lager.init.SeedDataLoaderLagerplatzExcel.read(SeedDataLoaderLagerplatzExcel.java:36)
        at de.biere.rglvs.lager.init.SeedDataLoaderLagerplatzExcel.<clinit>(SeedDataLoaderLagerplatzExcel.java:27)
        at de.biere.rglvs.lager.init.DataLoaderLagerplatz.run(DataLoaderLagerplatz.java:27)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:794)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:324)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
        at de.biere.rglvs.RglvsApplication.main(RglvsApplication.java:23)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

还有其他一些弹簧注射问题。如果需要,我可以发布整个错误消息(它延伸到几页)。我也不确定我是否在这个网站上正确发布了代码 - 提前抱歉!!..

【问题讨论】:

  • 你的路径错误。是什么让您认为该文件位于 build/... 中?这看起来像您本地机器中的路径。我最好的建议是将容器和 docker exec 挂在其中。周围看看。尝试自己理解问题。您似乎对 docker 的工作原理存在根本性的误解,仅仅为您提供解决方案无助于纠正。
  • 该文件在“build”中,因为我把它放在我自己的目录中。我知道这行不通。我访问它的 java 类使用相对路径。你是对的,我不太了解 docker,但这就是为什么我至少需要更多提示。我对 docker 的理解是它是一个可以运行应用程序的容器。但是为了运行它,它现在需要如何访问它。但我似乎找不到真正有效的方法。此语法中的“test.xls”应该是 docker 映像中的文件名。什么是正确的语法?我也试过“复制文件路径新文件名”。失败。
  • 我知道为了从容器中访问文件,它应该与我的目录中的名称相同,所以我也尝试过。这样java类就可以从容器中访问它了。事情是,据我了解, .jar 和 .xls 文件存储在容器的同一存储级别上。而在我的应用程序中,它们有不同的目录,因此访问我类中文件的命令看起来在同一个地方,不知道文件在不同的地方,具体取决于它是在图像上还是在我的本地目录上。如果我错了,请纠正我。正如我所说,我对此并不陌生。
  • 您的建议是否暗示我应该使用 .yml 文件?我不明白为什么会有所不同,除了它是在 dockerfile 之前执行的。你的意思是“把容器挂在上面”吗?到底是什么?图片?在 .yml 文件中,我应该能够从 .xls 文件中定义依赖关系。我做对了吗?
  • 丹尼,你能告诉你是怎么解决的吗?我对这一切都很陌生,并且有完全相同的要求

标签: java docker gradle dockerfile


【解决方案1】:

抱歉发帖不解释。

目前,您的 Dockerfiles 将创建目录“app.jar”并在其中复制 app.jar。同时,入口点将查找 /app.jar,而是会找到名为 app.jar 的目录,从而引发损坏jar 错误。

解决方法是将app.jar直接复制到/

这应该可行。

FROM openjdk:8-jre

ARG JAR_FILE

ARG XLS_FILE

COPY ${JAR_FILE} ${XLS_FILE} /

ENTRYPOINT ["java","-jar", "-Dserver.port=80" , "-Dprofile=prod", "/app.jar"]

【讨论】:

  • 为什么要这样做?这应该怎么做?为什么 OPs 代码不起作用?正是出于这个原因,不鼓励仅使用代码回答。
  • 不起作用。 “错误:无效或损坏的 jarfile /app.jar”。我仍然看不到容器中的类如何知道它在哪里以及如何访问 .xls 文件
猜你喜欢
  • 2018-11-22
  • 2015-08-07
  • 2020-08-05
  • 2018-02-28
  • 1970-01-01
  • 2022-12-04
  • 2011-11-07
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多