如何将运行在 Docker 容器中的 Flyway 连接到运行在 Docker 容器中的数据库?
Posted
技术标签:
【中文标题】如何将运行在 Docker 容器中的 Flyway 连接到运行在 Docker 容器中的数据库?【英文标题】:How to connect Flyway running in a Docker container to a database running in a Docker container? 【发布时间】:2019-07-26 21:18:03 【问题描述】:我们使用 Microsoft SQL Server 作为数据库并使用 Flyway 来管理它。现在我想通过在 Docker 中启动 SQL Server 并在我自己的 Docker 容器中启动 Flyway 脚本来测试 Flyway 脚本,该容器包含所有配置和所有 Flyway 数据库脚本(迁移)。
据我所知,无法在 Flyway 配置文件中使用环境变量。理想情况下,这是可能的:
flyway.url=jdbc:sqlserver://$MSSQL_SERVICE_HOST:$MSSQL_SERVICE_PORT;databaseName=testing_pp
flyway.user=testing_pp
flyway.password=$MSSQL_SERVICE_PASSWORD
事实上,我需要知道独立 Docker 和 OpenShift 的最佳策略。我对两者都很陌生...
有没有办法将 IP 地址和端口从一个正在运行的 Docker 容器注入到另一个容器?一个不涉及 Docker Compose 的?在 OpenShift 中正确的做法是什么?我知道那里的 pod 从所有正在运行的 pod 中获取主机和端口作为环境变量(请参阅我的假设解决方案)。但是这些变量没有解决,它没有解决我的问题。
你是怎么做这些测试的?
【问题讨论】:
【参考方案1】:如果我没听错的话,问题是如何在没有docker-compose
的情况下连接两个 docker 容器。事实上,docker-compose
在这些方面并没有添加太多内容 - 它只是自动化了几个步骤。
要连接容器,您必须:
创建新的用户自定义桥接网络(完成一次):docker network create foo
使用--network=foo
启动选项将两个容器连接到此网络
指定容器名称,而不是使用--name=xyz
自动生成
在连接字符串中使用这些名称而不是 IP 地址。
docker network create foo
docker run -d --rm --name=my-database --network=foo <SQLServerImageName>
docker run -d --rm --name=my-flyway --network=foo <FlyWayImageName>
现在您可以使用 server=my-database
从 Flyway 连接到 SQL
【讨论】:
谢谢,这解决了方程式的一部分。另一种是使用环境变量将该名称输入 Flyway。docker run -d --rm -e "SQL_SERVER=my-database" --name=my-flyway --network=foo <FlyWayImageName>
抱歉让您久等了...我使用 shell 脚本测试了所有内容。似乎 Flyway(我没有以分离模式启动,因为它是一次性的)看不到网络:Boxfuse 的 Flyway 社区版 5.0.7 错误:无法从数据库获取连接(jdbc:sqlserver ://flyway:1433;databaseName=etrademark) for user 'etrademark': TCP/IP 连接到主机 flyway,端口 1433 失败。错误:“flyway。验证连接属性。确保 SQL Server 实例正在主机上运行并在端口接受 TCP/IP 连接。”
你知道如何检查容器是否知道域名吗?
我的错误是我使用网络名称作为域名连接。我需要在我的 JDBC 连接字符串中使用 Docker 名称,在本例中为 my-database
。以上是关于如何将运行在 Docker 容器中的 Flyway 连接到运行在 Docker 容器中的数据库?的主要内容,如果未能解决你的问题,请参考以下文章
在 docker 容器上运行数据库时,Flyway 找不到迁移
使用 Flyway 和 Docker 容器内的嵌入式 Postgresql 运行测试时出现 java.net.ConnectException