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

Posted

技术标签:

【中文标题】如何从 Spring Boot Docker 容器访问外部服务器文件夹?【英文标题】:How to access an external server folder from a spring boot docker container? 【发布时间】:2021-01-06 07:55:51 【问题描述】:

我正在使用 docker-composedocker 容器中运行 spring boot 应用程序。一个spring boot使用嵌入式tomcat来运行。

服务器 (/opt/cp/uploads) 上有一个外部文件夹,其中包含我想从 Spring Boot Docker 容器访问的图像。

docker-compose.yaml 文件中定义了以下容器:

nginx mysql springboot-app

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: 
    

【问题讨论】:

【参考方案1】:

实际上,这个选项可以通过 application.properties 和嵌入式 tomcat 获得:

spring.mvc.static-path-pattern=/uploads/**
spring.resources.static-locations=file:/opt/uploads

【讨论】:

【参考方案2】:

也许更好地将 Tomcat 用于 docker 映像而不是 OpenJDK。

这样您就可以为外部路径设置 Tomcat 配置

看这里:https://medium.com/@iamvickyav/deploying-spring-boot-war-in-tomcat-based-docker-2b689b206496

【讨论】:

以上是关于如何从 Spring Boot Docker 容器访问外部服务器文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Spring Boot Docker 容器连接 mysql Docker 容器

尝试从 Spring Boot Docker 容器连接到 mongo Docker 容器时验证 MongoCredential 时出错?

如何从 Docker 'run' 命令设置 Spring Boot 属性

无法从 docker 容器内的 Spring Boot 连接到 Redis

如何从 nginx 发送请求并将容器反应到 Spring Boot 容器?

如何从 docker 命令行设置参数来配置 Spring Boot 应用程序?