Docker не видит папку с статическим контентом (images)
Я делаю проект с использованием Spring Boot и Maven. В моем проекте есть функционал по загрузке фотографий на сервер (аватарок). Они загружаются в папку со статическим контентом (static) в папку images (полный путь от корня src/main/resources/static/images), также для "раздачи" статического контента у меня есть код, который "раздает" статический контент (чтобы не перезагружать сервер для обновления фотографий).
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Value("${upload.resources-path}")
private String uploadPath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/images/**")
.addResourceLocations("file:" + uploadPath + "/");
}
}
* Переменная uploadPath = "src\main\resources\static\images"
Сам функционал работает на локальном компьютере и при попытке установить это всё на Docker, приложение перестает видеть папку images и подгрузка фотографий прекращается. Самая картинка сохраняется не в виде массива byte[], а просто как цельная картинка и затем с HTML-страницы я просто обращаюсь к нужному адресу до аватарки пользователя (к примеру, http://localhost:8080/images/anon.jpg). Интересный момент в том, что JS и CSS из этой папки он подгружает. А при оббращении к images возникает что-то такое GET http://localhost:8080/images/anon.jpg 404
В целом, больше никаких настроек по поводу статического контента нет, кроме класса MvcConfig и перемнной uploadPath. Если нужны какие-то ещё файла или пояснения спрашивайте.
Ниже привёл файл docker-compose.yml
version: '3.7'
services: db:
image: postgres
container_name: postgres
ports:
- 5432:5432
environment:
POSTGRES_USERNAME: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: dexterity
compileta:
container_name: compileta
image: compileta
ports:
- 8081:8081
environment:
SERVER_PORT: 8081
app:
build: .
container_name: dexterity
ports:
- 8080:8080
command: java -jar dexterity.jar --spring.profiles.active=dev
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/dexterity
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: 1234
COMPILETA_COMPILEURL: http://compileta:8081/compile
COMPILETA_COMPILALLURL: http://compileta:8081/compile_all
links:
- db
- compileta
Ответы (1 шт):
Тут проблема совсем не в докере, а в том, что ваш код написан непереносимым образом.
А именно он будет работать только при запуске его из корневой директории проекта (что и делает IDE). Если вы запустите приложение на хосте из другого каталога, то приложение не найдет папку src\main\resources\static\images точно также как и сейчас оно не находит ее в докере.
Другими словами код рассчитывает, что в текущей директории будет существовать директория src, в ней main и т.д., а в при запуске в докер это не так. Там существует только jar файл с приложением. Само приложение пробует использовать несуществующую директорию.
Чтоб исправить эту проблему, вам нужно использовать какую-то директорию, которая существует в докер контейнер. Создайте параметр конфигурации, который будет определять, где нужно хранить загруженные файлы, и задавайте его в конфигурации docker-compose.
Саму директорию нужно через volume присоединить к контейнеру (если вам нужно данные сохранять при перезапуске приложения), либо нужно создать ее при сборке образа, либо само приложение при старте должно ее создавать.
Это может быть абсолютно произвольный путь в контейнере. Например /avatars. Если без volume, то в Dockerfile нужно добавить команду создания директории:
...
RUN mkdir /avatars
...
С volume это может так:
app:
container_name: dexterity
build: .
ports:
- 8080:8080
command: java -jar --spring.profiles.active=dev dexterity.jar --upload.resources-path=/avatars
volumes:
- /some/path/on/host/avatars:/avatars
это присоединит папку с хоста /some/path/on/host/avatar в контейнер как /avatars и задаст параметр upload.resources-path.
Еще одни момент - это использование src/main/resources для хранения динамических данных. Это опять же непереносимо. Там должны быть только статические ресурсы. Все динамическое должно быть либо в БД либо в файловой системе.