问题描述
我正在使用 docker-compose 在 docker 容器中运行 spring boot应用程序。弹簧靴使用嵌入式tomcat 运行。
服务器(/ opt / cp / uploads)上有一个外部文件夹,其中包含我想从Spring Boot Docker容器访问的图像。
在 docker-compose.yaml 文件中,定义了以下容器:
Nginx和CloudFlare将域重定向到端口8080上的spring应用程序。 我想访问这样的图像: https://domainname.com/uploads/imageName.png
使用tomcat,这是在server.xml中完成的:
<Context docBase="/opt/uploads" path="/uploads"/>
但是该选项显然无法通过带有嵌入式tomcat的application.properties使用。
这是怎么发生的?
我的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=true&useSSL=false&useUnicode=yes&characterEncoding=UTF-8&characterSetResults=UTF-8&useJDBCCompliantTimezoneshift=true&useLegacyDatetimeCode=false&allowPublicKeyRetrieval=true&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: {
}
解决方法
也许最好将Tomcat用于docker镜像而不是OpenJDK。
这样,您可以为外部路径设置Tomcat配置
在这里看看:https://medium.com/@iamvickyav/deploying-spring-boot-war-in-tomcat-based-docker-2b689b206496
,实际上,此选项可通过具有嵌入式tomcat的application.properties使用:
spring.mvc.static-path-pattern=/uploads/**
spring.resources.static-locations=file:/opt/uploads