如何将Spring Boot Docker容器与PostgreSQL Docker容器连接
解决Spring Boot容器与PostgreSQL容器连接问题
错误原因分析
你执行docker run时,把--spring.datasource.url参数放在镜像名之后,而Docker的CMD使用的是exec格式(["./mvnw", "spring-boot:run"]),这会导致Docker将该参数当作独立命令去执行,而非传递给./mvnw,因此出现"找不到文件或目录"的错误。
解决方案
方案1:正确传递Spring参数到mvnw命令
修改docker run命令,将Spring参数作为./mvnw spring-boot:run的一部分,替换原命令:
docker run --name java-docker --rm -p 8080:8080 --network demo_full_stack_postgres java-docker ./mvnw spring-boot:run --spring.datasource.url=jdbc:postgresql://db:5432/customer
如果需要同时覆盖用户名和密码,可追加参数:
docker run --name java-docker --rm -p 8080:8080 --network demo_full_stack_postgres java-docker ./mvnw spring-boot:run --spring.datasource.url=jdbc:postgresql://db:5432/customer --spring.datasource.username=your_db_user --spring.datasource.password=your_db_pass
方案2:使用环境变量覆盖配置(推荐)
Spring Boot支持通过环境变量自动覆盖application.yaml中的配置,这种方式更符合Docker最佳实践:
docker run --name java-docker --rm -p 8080:8080 --network demo_full_stack_postgres \ -e SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/customer \ -e SPRING_DATASOURCE_USERNAME=your_db_user \ -e SPRING_DATASOURCE_PASSWORD=your_db_pass \ java-docker
注意:环境变量名需将配置中的驼峰/短横线格式转为大写,并用下划线分隔,比如
spring.datasource.url对应SPRING_DATASOURCE_URL
额外检查项
- 确认PostgreSQL容器已启动,且加入了
demo_full_stack_postgres网络,容器名称为db(若数据库容器名称不是db,需将URL中的db替换为实际容器名) - 确认PostgreSQL容器内已创建
customer数据库,且用户名、密码与你传递的参数一致 - 数据库容器内部端口为默认的5432,容器间连接无需使用主机映射的5332端口(主机端口仅用于外部访问容器内的数据库)
内容的提问来源于stack exchange,提问作者Ilia Shefer
相关产品推荐
相关产品推荐

