在加载Docker容器中/apps/authentication/users.json中的JSON文件时面对FileNotFoundException,它是Spring-Boot应用程序。此JSON文件位于/apps/authentication/users.json文件夹中。不知道如何使用Docker读取文件。请帮忙。
尝试下面的代码:
List<User> user = null;
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
TypeReference<List<User>> userMapType = new TypeReference<List<User>>() {};
InputStream userIs = TypeReference.class.getResourceAsStream("file:///apps/authentication/users.json");
try {
user = mapper.readValue(userIs, userMapType);
log.info("Dummy User Object is created successfully picked from the location : "+dummyUserConfig.getLocation());
} catch (IOException e) {
System.out.println(e.getMessage());
}
finally{
if(null != userIs) {
try {
userIs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
userIs对象为null。我已经尝试了很多路径“file:///apps/authentication/users.json”的组合。
我用谷歌搜索,发现可以在这里使用Docker的音量。请指导我
答案 0 :(得分:0)
我想users.json
在你的主机上,但不在你的Docker容器中。您需要使用-v
参数(或-m
参数)并创建单独的卷,或使用bind mounts。
这实际上使用以下格式将主机上的特定文件夹(或文件)安装到容器上的特定文件夹(或文件):-v SOURCE:DEST
。
在您的情况下,如果您只想共享文件,可以使用:
docker run -v /apps/authentication/users.json:/apps/authentication/users.json your-image
如果您想要更宽松并且想要共享整个/apps
文件夹,可以使用:
docker run -v /apps:/apps your-image
您不需要在代码中实际更改任何内容。但是,如果您想使文件的位置可配置,您可以将其放在application.properties
:
users.file=/apps/authentication/users.json
现在您可以在代码中使用@Value
:
@Value("${users.file}")
private FileSystemResource usersFile;
现在,您可以拨打usersFile.getFile()
或usersFile.getInputStream()
并使用相同的方法。
这样做的好处是您可以选择放置JSON文件的位置,如果您想使用Docker运行它,现在可以使用-e
参数将USERS_FILE
作为环境传递变量
docker run -v /apps/authentication/users.json:/custom/folder/users.json -e USERS_FILE /custom/folder/users.json your-image