Как получить доступ к папке внешнего сервера из контейнера spring boot docker?

#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