【发布时间】: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