【发布时间】:2017-01-13 05:33:52
【问题描述】:
为了正确测试我的 Spring Boot 应用程序,我在集成测试中使用了 embedded Postgresql。此外,我也使用 Flyway,它被配置为使用基于 Postgresql 配置的数据源(查看 EmbeddedPostgresConfiguration 和 FlywayConfiguration 类)。
在我的环境 (OS X) 上运行时,我的所有测试都顺利通过,但在 Docker 容器中运行时它们都失败了(java:8 和 openjdk:8 图像)。而且我不知道造成这种差异的原因是什么以及如何修复它以使测试在 Docker 内部通过(进一步的持续集成管道需要它)。
这里是复制问题的最小代码示例:https://github.com/nkoder/postgresql-embedded-example。
要运行测试没有问题运行./gradlew clean test。要运行失败的测试,请运行 docker build .。
在 Docker 内部运行测试期间抛出的错误:
java.lang.IllegalStateException
Caused by: org.springframework.beans.factory.BeanCreationException
Caused by: org.springframework.beans.BeanInstantiationException
Caused by: org.flywaydb.core.api.FlywayException
Caused by: org.postgresql.util.PSQLException
Caused by: java.net.ConnectException
我试图为自己解决这个问题,但我仍然只有一些猜测,没有什么可靠的。唯一的“提示”:对于嵌入式 Postgresql 配置中使用的硬编码(非随机)端口,有时在FlywayConfiguration 类中的flyway.clean(); 行中会发生类似的异常(当在实际项目中运行来自 IntelliJ IDEA 的测试并进行更多测试时),这似乎是通过提供的数据源访问数据库的第一行代码。
更新 1: Postgresql 实例是在随机开放端口 inside 同一 Docker 容器上的 localhost 测试期间创建的。我怀疑不需要连接到主机(外部容器)。
【问题讨论】:
-
ConnectException 总是在代理或防火墙阻止输出连接时出现。你看过 Docker 的互联配置吗?
-
测试和嵌入式 Postgresql 在同一个容器中运行。我的意思是在测试中有在
localhost:<randomOpenPort>创建的postgresql,它被用作数据源。容器“外部”没有任何东西可以到达互联网(或者至少我不知道)。 -
我明白了,但我坚持:即使通信保持在同一个本地主机内,连接到本地端口也可能被本地防火墙阻止。
-
好的,我当时误解了你,现在我明白了。会检查
标签: java postgresql docker spring-boot flyway