java.net.ConnectException 当 运行 在 Docker 容器中使用 Flyway 和嵌入式 Postgresql 进行测试时

java.net.ConnectException when running test with Flyway and embedded Postgresql inside Docker container

为了正确测试我的 Spring 启动应用程序,我在集成测试中使用了 embedded Postgresql。此外,我也使用 Flyway,它被配置为使用基于 Postgresql 配置的数据源(查看 EmbeddedPostgresConfigurationFlywayConfiguration classes)。

在我的环境 (OS X) 上 运行ning 时,我的所有测试都没有问题地通过了,但是当 运行 在 Docker 容器中时,它们失败了(对于两者java:8openjdk: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

我试图自己解决这个问题,但我仍然只有一些猜测,没有什么可靠的。唯一的 "hint":对于嵌入式 Postgresql 配置中使用的硬编码(非随机)端口,有时在 FlywayConfiguration class 中的行 flyway.clean(); 中会出现类似的异常(当 运行在实际项目中使用 IntelliJ IDEA 进行更多测试)这似乎是通过提供的数据源访问数据库的第一行代码。

更新 1: Postgresql 实例是在本地主机上随机打开端口 inside 相同 Docker 容器的测试期间创建的。我怀疑不需要连接到主机(容器外部)。

您的问题很可能是您的应用程序试图访问本地主机上的数据库。但是当它在 docker 容器中是 运行 时,localhost 是容器而不是 hist 机器。因此,您必须更改配置才能使其正常工作。

问题已解决!

根据https://github.com/yandex-qatools/postgresql-embedded,我们不能在测试中使用 root 运行 嵌入式 Postgresql。因此,我需要解决的问题是 运行 以非 root 用户身份在 Docker 中进行测试。

您可以在此处查看修复:https://github.com/nkoder/postgresql-embedded-example/commit/391977052b1563cdcabf66a2fe3ca0a3e0a7b358