从 docker-compose 使用时,flyway 不接受迁移

Posted

技术标签:

【中文标题】从 docker-compose 使用时,flyway 不接受迁移【英文标题】:flyway not picking up migrations when used from docker-compose 【发布时间】:2020-09-26 08:41:45 【问题描述】:

我的 docker-compose.yml 文件中有以下服务:

flyway:
    image: boxfuse/flyway:latest-alpine
    command: -url=jdbc:postgresql://yurldb:5432/yurldb -schemas=public -user=postgres -password=somepassword migrate
    networks:
      - yunet
    volumes:
      - ./flyway:/flyway/sql
    restart: on-failure
    depends_on:
      - yurldb

我的资源包中只有一个迁移:

当我使用 docker compose (docker-compose up -d --build flyway) 运行服务时 flyway 创建 flyway_schema_history 表,但不创建迁移中定义的表。如果我检查日志,我会看到此消息:

Boxfuse 数据库的 Flyway 社区版 5.2.4: jdbc:postgresql://yurldb:5432/yurldb (PostgreSQL 10.13) 成功 已验证 0 个迁移(执行时间 00:00.011s)的当前版本 schema "public": > Schema "public" 是最新的。不 需要迁移。

未触发迁移。这是为什么?我不确定我错过了什么。我在正确的包中进行了迁移,并且里面的 SQL 也是正确的(否则会出现某种语法错误)。它只是没有检测到这种迁移。有什么想法吗?

更新 我刚刚注意到,当我运行该命令时,会在包结构中创建一个小目录。不知道是什么:

我还添加了另一张图片来展示项目的整体结构:

更新 2 使用卷映射./src/main/resources/db.migration:/flyway/sql 在我的包结构中生成了一个附加目录:

【问题讨论】:

映射./flywayresource catalog 是什么样子的? @ŁukaszOlszewski 我不确定我是否完全理解你的问题,但我刚刚写了一个更新。当我运行 docker compose 时会创建一个小目录。它有一个灰色的小符号(不确定它的含义)。另外我不确定资源目录是什么。你能给我解释一下吗? 你需要映射resource catalog做docker容器。在你的 docker compose 文件中试试这个./src/main/resource /db.migration:/flyway/sql @ŁukaszOlszewski 您刚刚发送的内容有误吗?我尝试了./src/main/resources/db.migration:/flyway/sql,但没有成功还注意到在资源下创建了一个带有灰色符号的新符号(我添加了一张图片) 是的,尝试在路径末尾添加/。例如。 ./src/main/resources/db.migration/:/flyway/sql/ 【参考方案1】:

将您的映射更改为./src/main/resources/db/migration:/flyway/sql

使用 db.migration 会导致 Docker 使用该名称创建,如果 db 目录中只有目录,Intellij 只会显示目录 db/migration 就像包名称 db.dmigration

【讨论】:

没错,我忘了 db.migration 实际上是另一个目录中的一个目录。我试过./src/main/resources/db/migration/:/flyway/sql/,它奏效了。谢谢

以上是关于从 docker-compose 使用时,flyway 不接受迁移的主要内容,如果未能解决你的问题,请参考以下文章

使用 docker-compose 在 Windows 上构建气流时出错

使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint

使用 docker-compose 从私有仓库拉取镜像

如何从docker-compose获取docker生成的ip端口

使用 nginx 将环境变量从 docker-compose 传递到 vue 应用程序

使用`docker-compose run`时无法调试,但`docker-compose up`有效