将环境变量传递给 Docker 时,Flyway 迁移失败

Posted

技术标签:

【中文标题】将环境变量传递给 Docker 时,Flyway 迁移失败【英文标题】:Flyway Migrations fails when passing Environment Variables to Docker 【发布时间】:2020-07-17 21:31:54 【问题描述】:

使用flyway 执行数据库迁移。使用 dockerized 版本并使用 conf 文件进行迁移配置。

下面是我的配置文件

flyway.url = jdbc:mysql://$MYSQLHOST:3306/myschema
flyway.user = myusername
flyway.password = mypassword
flyway.schemas = myschema
flyway.cleanDisabled = true

正在运行以下命令来执行迁移

sudo docker run -e "MYSQLHOST=myhostip" --rm -it -v `pwd`/path/to/confi/:/flyway/conf/ -v `pwd`/path/to/migrations:/flyway/sql boxfuse/flyway:5.1.4 -configFiles=/flyway/conf/flyway.conf migrate

出现以下错误

ERROR: 
Unable to obtain connection from database (jdbc:mysql://$MYSQLHOST:3306/myschema) for user 'myuser': Could not connect to address=(host=$MYSQLHOST)(port=3306)(type=master) : $MYSQLHOST
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL State  : 08
Error Code : -1
Message    : Could not connect to address=(host=$MYSQLHOST)(port=3306)(type=master) : $MYSQLHOST

如果我使用主机 IP 详细信息更改配置文件,则迁移成功且没有任何错误。我做错了什么?

【问题讨论】:

【参考方案1】:

Flyway 允许您通过一组特定的环境变量传入配置参数;它不会在配置文件中执行完整的变量替换。见https://flywaydb.org/documentation/envvars。

你可以做的是删除配置文件的第一行,然后

sudo docker run -e "FLYWAY_URL=jdbc:mysql://myhostip:3306/myschema" ...

【讨论】:

我在这里遗漏了什么吗?那我们不是破坏了配置文件的使用吗 通过配置文件、环境变量和命令行选项传递 URL 都是等效的。你会以什么方式破坏 conf 文件? 现在支持环境变量,见flywaydb.org/documentation/configuration/…【参考方案2】:

我发现只看到一个解释存在 envVar 的页面并没有提及实际使用的确切 env 变量名称不是很有帮助。

这里是环境名称的定义/特别是对于 gradle 插件,但我怀疑它们通常是有效的:

https://github.com/flyway/flyway/blob/master/flyway-core/src/main/java/org/flywaydb/core/internal/configuration/ConfigUtils.java#L139

【讨论】:

以上是关于将环境变量传递给 Docker 时,Flyway 迁移失败的主要内容,如果未能解决你的问题,请参考以下文章

无法将环境变量传递给 docker

如何将 Github Secret 作为环境变量传递给 Docker?

在运行时将环境变量传递给 Vue 应用程序

将所有主机环境变量传递给 docker 容器的最简单方法

如何将环境变量从 docker-compose 传递给项目?

使用 Docker 将环境变量传递给 Spring Boot 应用程序不起作用