FileNotFoundException(不允许操作)错误但标志指向文件存在?
FileNotFoundException (operation not permitted) error but signs point to file present?
我正在尝试在我的 Windows 机器上的 Kubernetes 容器中部署 SparkJava REST 应用程序。
- Windows 10
- Kubernetes v1.22.5
- (编辑)基本图像:openjdk:8-alpine
我正在尝试在应用程序启动时读取属性文件。我在我的 YAML 中创建了一个指向文件所在位置的卷挂载。但是,容器总是在我启动时崩溃。我已经从容器中截取了 YAML 和日志的屏幕截图。我尝试记录了一些测试结果以确保系统可以找到挂载的驱动器和文件,并且我还记录了 canRead
属性 以调试是否是权限问题。测试似乎表明该文件是可见和可读的;但抛出的错误会另有说明。
我所做的一些研究指出了使卷安装正常工作所需的可能错误或黑客攻击,但我没有阅读任何似乎与我的问题密切相关的内容。
有没有人看出我做错了什么?
这是我的 java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import static spark.Spark.*;
public class RestClient {
private static final int sparkPort = 4567;
public static void main(String[] args) {
port(sparkPort);
String hostPath = "/root";
String propsFilePath = hostPath + "/resttest.properties";
File host = new File(hostPath);
if(!host.exists()){
System.out.println("Could not find host path");
return;
}
System.out.println("Found host path");
File propsFile = new File(propsFilePath);
if(!propsFile.exists()){
System.out.println("Could not find host path");
return;
}
System.out.println("Found propsFile path");
System.out.println(">> isDirectory: " + propsFile.isDirectory());
System.out.println(">> isFile: " + propsFile.isFile());
System.out.println(">> canRead: " + propsFile.canRead());
Properties properties = new Properties();
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(propsFile);
} catch (SecurityException fnf) {
System.out.println("Security issue");
fnf.printStackTrace();
return;
} catch (FileNotFoundException fnf) {
System.out.println("Could not open file");
fnf.printStackTrace();
return;
}
try {
properties.load(fileInputStream);
} catch (IOException fe1) {
fe1.printStackTrace();
}
get("/hello", (req,res) -> {
return "Hello World! My properties file is "+ propsFile +" and from it I learned I was "+ properties.getProperty("age") +" years old";
});
}
}
已发布基于 topic with similar issue on the GitHub 的社区维基答案。随意扩展它。
解决方法是在/c/users/<some-folder>/<some-folder>/gits/resttest
前加上/run/desktop/mnt/host
:
- name: approot
hostPath:
path: /run/desktop/mnt/host/c/users/<some-folder>/<some-folder>/gits/resttest
type: Directory
我正在尝试在我的 Windows 机器上的 Kubernetes 容器中部署 SparkJava REST 应用程序。
- Windows 10
- Kubernetes v1.22.5
- (编辑)基本图像:openjdk:8-alpine
我正在尝试在应用程序启动时读取属性文件。我在我的 YAML 中创建了一个指向文件所在位置的卷挂载。但是,容器总是在我启动时崩溃。我已经从容器中截取了 YAML 和日志的屏幕截图。我尝试记录了一些测试结果以确保系统可以找到挂载的驱动器和文件,并且我还记录了 canRead
属性 以调试是否是权限问题。测试似乎表明该文件是可见和可读的;但抛出的错误会另有说明。
我所做的一些研究指出了使卷安装正常工作所需的可能错误或黑客攻击,但我没有阅读任何似乎与我的问题密切相关的内容。
有没有人看出我做错了什么?
这是我的 java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import static spark.Spark.*;
public class RestClient {
private static final int sparkPort = 4567;
public static void main(String[] args) {
port(sparkPort);
String hostPath = "/root";
String propsFilePath = hostPath + "/resttest.properties";
File host = new File(hostPath);
if(!host.exists()){
System.out.println("Could not find host path");
return;
}
System.out.println("Found host path");
File propsFile = new File(propsFilePath);
if(!propsFile.exists()){
System.out.println("Could not find host path");
return;
}
System.out.println("Found propsFile path");
System.out.println(">> isDirectory: " + propsFile.isDirectory());
System.out.println(">> isFile: " + propsFile.isFile());
System.out.println(">> canRead: " + propsFile.canRead());
Properties properties = new Properties();
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(propsFile);
} catch (SecurityException fnf) {
System.out.println("Security issue");
fnf.printStackTrace();
return;
} catch (FileNotFoundException fnf) {
System.out.println("Could not open file");
fnf.printStackTrace();
return;
}
try {
properties.load(fileInputStream);
} catch (IOException fe1) {
fe1.printStackTrace();
}
get("/hello", (req,res) -> {
return "Hello World! My properties file is "+ propsFile +" and from it I learned I was "+ properties.getProperty("age") +" years old";
});
}
}
已发布基于 topic with similar issue on the GitHub 的社区维基答案。随意扩展它。
解决方法是在/c/users/<some-folder>/<some-folder>/gits/resttest
前加上/run/desktop/mnt/host
:
- name: approot
hostPath:
path: /run/desktop/mnt/host/c/users/<some-folder>/<some-folder>/gits/resttest
type: Directory