如何将运行在 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 &lt;FlyWayImageName&gt; 抱歉让您久等了...我使用 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 添加到 MySQL Docker 容器

使用 Flyway 和 Docker 容器内的嵌入式 Postgresql 运行测试时出现 java.net.ConnectException

flyway 无法连接到 docker-entrypoint-initdb.d 脚本中的 postgres 容器

未找到 Flyway 迁移路径

如何在不同的(依赖的)容器启动后对 docker 容器运行 .sql 脚本?