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
相关产品推荐
相关产品推荐

