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 配置的数据源(查看 EmbeddedPostgresConfiguration
和 FlywayConfiguration
classes)。
在我的环境 (OS X) 上 运行ning 时,我的所有测试都没有问题地通过了,但是当 运行 在 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
我试图自己解决这个问题,但我仍然只有一些猜测,没有什么可靠的。唯一的 "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 中进行测试。
为了正确测试我的 Spring 启动应用程序,我在集成测试中使用了 embedded Postgresql。此外,我也使用 Flyway,它被配置为使用基于 Postgresql 配置的数据源(查看 EmbeddedPostgresConfiguration
和 FlywayConfiguration
classes)。
在我的环境 (OS X) 上 运行ning 时,我的所有测试都没有问题地通过了,但是当 运行 在 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
我试图自己解决这个问题,但我仍然只有一些猜测,没有什么可靠的。唯一的 "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 中进行测试。