Не удается прочитать файл через Docker-контейнер - PullRequest
1 голос
/ 06 марта 2019

У меня есть приложение для начальной загрузки, и у меня есть несколько файлов, помещенных в / src / main / java / resources, которые я пытаюсь прочитать в моем коде. Когда тот же код пытается прочитать из контейнера Docker, он говорит, что файл не существует. Тот же код прекрасно работает через localhost

Файлы находятся в папке / src / main / java / resources / data, и это мой код, который пытается прочитать файл

 private String getJson(String folderName, String id, StringBuilder sb) throws Exception {
        String responseJson = null;
        String filePath = "data" + File.separator + folderName + File.separator + id + ".json";
        LOG.info("printing filePath : " + filePath);
        LOG.info("printing id : " + id);
        File f = new File(filePath);
       // if(f.exists()){
            try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath)) {
                LOG.info("printing inputStream : " + inputStream);
                if (inputStream != null) {
                    responseJson = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
                }
                if (responseJson == null || responseJson.isEmpty()) {
                    LOG.info("json response is null : ");
                    throw new JsonNotFoundException(Constant.JSON_NOT_FOUND);
                }
                sb.append(responseJson);
            } catch (IOException e) {
                LOG.info("IO exception : ");
                throw new IOException(e);
            } catch (Exception e) {
                LOG.info(" exception : ");
                throw new Exception(e);
            }
//        }
//        else{
//            LOG.info("file doesnt exists : " + filePath);
//        }
        return sb.toString();
    }

Пример пути к файлу: src / main / resources / data / get-products / 1420-17612-82.json Содержимое файла Docker

{
  "commands":
  [
    "rm -rf .tmp",
    "git clone git@github.com:{orgnname}/{test-service.git} -b COECP-973-Configure-logging-mechanism-for-Service .tmp/test-service",
    "docker build .tmp/test-service/.docker/build/db -t local/test-service/db",
    "docker build .tmp/test-service -t local/test-service/app"
  ]
}

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Итак ... вы перепутали путь для File и для ресурсов из пути к классам.Какова причина иметь File f = new File(filePath);?

Вот вещи:

  1. Если вы используете File - файлы должны быть доступны JVM, и если вы используете относительный путь, такой как data\folderxxx\filexxx.json, он долженбыть доступным в файловой системе контейнера.Т.е. папка data должна быть размещена в образе или смонтирована снаружи точно в каталог, из которого запускается JVM

  2. Если вы используете ClassLoader и ResourceAsStream корневой каталог вашего dataдолжен быть определен в пути к классам для JVM или находиться в файле Jar - это также корень в classpath.Проверьте ваш файл jar - если каталог data находится в корне jar - все отлично и файлы будут доступны по this.getClass().getClassLoader().getResourceAsStream(filePath), , но не для new File(filePath)!

если нет - сделайте это или обновите свой filePath для ResourceAsStream соответственно.

0 голосов
/ 06 марта 2019

Ранее я сталкивался с той же проблемой, хотя со временем наше требование усложнялось, но следующий код должен решить вашу проблему:

    ClassPathResource cp = new ClassPathResource("relative_path_to_file");
    File f = null;

    if (cp.exists())
        f = cp.getFile();
...