You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot应用Docker部署后Swagger无法访问问题求助

Spring Boot Docker部署后Swagger无法访问问题排查

问题描述

在Spring Boot应用中使用springdoc生成Swagger,本地直接运行时可通过http://localhost:8090/swagger-ui/index.html正常访问,但通过Docker部署后无法访问该地址。

相关配置

Dockerfile

FROM openjdk:17

COPY target/subscription-manager-0.0.1-SNAPSHOT.jar subscription-manager.jar

ENTRYPOINT ["java", "-jar", "subscription-manager.jar"]

docker-compose.yml

services:
  subscription-manager_app:
    container_name: subscription-manager_app
    image: hizam/subscription-manager_app:1.0.0
    build: .
    ports:
      - '8090:8080'
    environment:
      DATABASE_URL: jdbc:postgresql://db:5432/subscription-manager
      DATABASE_USERNAME: postgres
      DATABASE_PASSWORD: 1
    depends_on:
      - db
  db:
    container_name: db
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 1
      POSTGRES_DB: subscription-manager
    ports:
      - '5333:5432'
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata: { }

SecurityFilterChain配置代码

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {

    private final UserService userService;
    private final JwtAuthenticationFilter jwtAuthenticationFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception
    {
        http.csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(authorize->
                authorize.requestMatchers("/swagger-ui/**","/swagger-resources/*","/v3/api-docs/**")
                        .permitAll()
                        .requestMatchers("/api/v1/auth/register","/api/v1/auth/login")
                        .permitAll()
                        .anyRequest().authenticated())
                .httpBasic(Customizer.withDefaults())
                .sessionManagement(session->session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authenticationProvider(authenticationProvider())
                .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }

    @Bean
    public AuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        daoAuthenticationProvider.setUserDetailsService(userService.userDetailsService());
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
        return daoAuthenticationProvider;

    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception
    {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

排查与解决方案

1. 端口映射与应用端口不匹配

你的docker-compose.yml中端口映射为8090:8080,意味着容器内应用需监听8080端口,本地通过8090端口访问。但如果Spring Boot应用配置了server.port=8090,容器内应用实际监听8090端口,和映射的内部端口不匹配,会导致无法访问。

解决方式:

  • 修改docker-compose.yml的端口映射为8090:8090
  • 或在应用配置文件(application.properties/application.yml)中设置server.port=8080,保持与容器内部端口一致

2. 检查应用是否正常启动

容器部署后,应用可能因数据库连接失败等问题未完全启动,导致Swagger无法访问。执行以下命令查看容器日志:

docker logs subscription-manager_app

若日志中存在数据库连接超时、初始化失败等错误,需先解决这些问题,确保应用成功启动。

3. 验证Swagger路径与上下文路径

你的Security配置已放开Swagger相关路径,但如果应用配置了server.servlet.context-path,访问Swagger时需要加上上下文路径,例如:

http://localhost:8090/[上下文路径]/swagger-ui/index.html

4. 检查本地端口占用

确认本地8090端口未被其他程序占用:

# Windows
netstat -ano | findstr :8090

# Linux/macOS
lsof -i :8090

若端口被占用,可停止占用程序,或修改docker-compose.yml中的本地映射端口(如改为8091:8080)。


内容的提问来源于stack exchange,提问作者Daniil Hizam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:00:14