如何从Spring Boot Docker容器访问外部服务器文件夹?

问题描述

我正在使用 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