#spring-boot #docker #tomcat #docker-compose #contextpath
#spring-boot #docker #tomcat #docker-compose #contextpath
Вопрос:
Я использую docker-compose для запуска приложения spring boot внутри контейнера docker. Для запуска spring boot используется встроенный tomcat.
На сервере есть внешняя папка (/opt / cp / uploads) с изображениями, к которым я хотел бы получить доступ из контейнера spring boot docker.
Внутри docker-compose.в файле yaml определены следующие контейнеры:
- nginx
- mysql
- springboot-приложение
nginx и CloudFlare перенаправляют домен в приложение spring на порт 8080. Я хотел бы получить доступ к изображениям следующим образом: https://domainname.com/uploads/imageName.png
С помощью tomcat это было сделано в server.xml:
<Context docBase="/opt/uploads" path="/uploads"/>
но эта опция, очевидно, недоступна через application.properties со встроенным tomcat.
Как это происходит?
Мой docker-compose.yaml:
version: '3.8'
services:
nginx:
container_name: some-nginx
hostname: nginx
image: nginx:1.19.2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
restart: unless-stopped
network_mode: host
mysqldb:
image: mysql:8.0.20
hostname: mysqldb
container_name: cp-mysqldb
environment:
- MYSQL_ROOT_PASSWORD=pass1234
- MYSQL_DATABASE=db_name
- MYSQL_USER=root
- MYSQL_PASSWORD=pass1234
ports:
- "3306:3306"
volumes:
- cp-mysqldb-data:/opt/mysql
restart: unless-stopped
springboot-app:
image: openjdk:8
hostname: cp
container_name: cp-springboot
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/db_name?autoReconnect=trueamp;useSSL=falseamp;useUnicode=yesamp;characterEncoding=UTF-8amp;characterSetResults=UTF-8amp;useJDBCCompliantTimezoneShift=trueamp;useLegacyDatetimeCode=falseamp;allowPublicKeyRetrieval=trueamp;serverTimezone=UTC
ports:
- "8080:8080"
depends_on:
- mysqldb
volumes:
- cp-springboot-data:/opt/cp
- ./target/cp-springboot-0.0.1-SNAPSHOT.war:/ROOT.war
command: ["java", "-jar",
"-Dspring.profiles.active=prod",
"ROOT.war"]
restart: always
volumes:
cp-springboot-data: {
}
cp-mysqldb-data: {
}
Ответ №1:
Возможно, лучше использовать Tomcat для docker image, а не OpenJDK.
Таким образом, вы можете настроить конфигурацию Tomcat для внешнего пути
Посмотрите здесь: https://medium.com/@iamvickyav/deploying-spring-boot-war-in-tomcat-based-docker-2b689b206496
Ответ №2:
На самом деле, эта опция доступна через application.properties со встроенным tomcat:
spring.mvc.static-path-pattern=/uploads/**
spring.resources.static-locations=file:/opt/uploads