Dockerfile HelloWorld.class HelloWorld.java
dockerfile:
FROM openjdk:11-jdk-slim
WORKDIR /app
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]
java类:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Docker World!");
}
}
这可以很好地工作
sudo docker build -t hello-world-java .
sudo docker run hello-world-java
但是,如果我在文件夹内容中添加了类的软件包,并且该类:
java类:
package hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Docker World!");
}
}
符号
~/workspace/helloWorldPackage$ tree
.
├── Dockerfile
└── hello
├── HelloWorld.class
└── HelloWorld.java
2 directories, 3 files
并修改Dockerfile,例如:
FROM openjdk:11-jdk-slim
WORKDIR /app
COPY hello/ .
RUN javac HelloWorld.java
CMD ["java", "hello.HelloWorld"]
我可以对其进行构建,但是当运行时,我会得到:
Error: Could not find or load main class hello.HelloWorld
Caused by: java.lang.ClassNotFoundException: hello.HelloWorld
exit status 1
我在Dockerfile中尝试了几次修改,但无济于事。主要是在CMD上修改classPath,或在复制/工作迪尔中复制的内容,但我认为我不明白这些命令的功能。 CMD是否从WorkDir的文件夹内部运行?它如何与复制文件夹进行交互?和Java命令?我认为我缺乏使它起作用的东西。我只能找到没有包装的Java Web应用程序或Java本地应用程序的教程或答案。 我期望与包装无爪哇应用程序所获得的相似行为。 IE。 Java的正确Dockerfile描述以捕获正确的类路径。
当您尝试启动
hello.HelloWorld
作为主要类时,JVM(除其他位置)查看了一个文件。 将文件复制到容器中时,您需要保持
hello/HelloWorld.class
结构。
线应包含整个目录。
COPY
(对于任何较大的项目,您可能想要一个更实质性的构建系统,例如Maven或Gradle。对于Java,在Docker之外构建应用程序并不少见,并且仅将Jar文件置于图像中;或者如果您运行了该应用程序在Dockerfile中构建,请确保在标准项目布局中进行整个树。)