我创建了这个小演示程序来显示我遇到的问题。
public class DemoApplication {
public static void main(String[] args) {
create(".", "1");
create("", "2");
create("app/usr", "3");
create("/usr/app", "4");
create("usr/app", "5");
}
public static void create(String location, String name) {
try {
File myObj = new File(location+ "/" + name + ".txt");
if (myObj.createNewFile()) {
System.out.println("File created: " + myObj.getName());
} else {
System.out.println("File already exists.");
}
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
我正在使用这个 Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} /usr/app/demo.jar
WORKDIR /usr/app/
VOLUME /usr/app/
ENTRYPOINT ["java","-jar","demo.jar"]
这些命令来构建容器
mvn clean package
docker build -t please/work .
最后但并非最不重要的是这个命令来运行容器
docker run please/work -v /root/hayasaka:/usr/app/
我也试过用这个
docker run please/work -v /root/hayasaka:/
但在这两种情况下,都不会在 /root/hayasaka 创建文件
这是我在运行容器时得到的控制台输出
File created: 1.txt
File created: 2.txt
An error occurred.
java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:1012)
at com.example.demo.DemoApplication.create(DemoApplication.java:23)
at com.example.demo.DemoApplication.main(DemoApplication.java:15)
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:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
File created: 4.txt
An error occurred.
java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:1012)
at com.example.demo.DemoApplication.create(DemoApplication.java:23)
at com.example.demo.DemoApplication.main(DemoApplication.java:17)
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:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
理论上应该在指定卷中创建1.txt或2.txt。哦,我也使用 Spring 初始化程序创建了项目,因为实际项目也是使用该工具创建的。作为可选依赖项,我只选择了开发工具,我没有更改 pom.xml 文件中的任何内容。