Kubernetes中使用Flyway Job执行Postgres数据库迁移遇连接及脚本找不到问题
问题根因
你在Docker Compose环境中是通过挂载本地目录的方式,将迁移脚本注入到Flyway容器的/flyway/sql路径下,但Kubernetes的Flyway Job配置里没有对应的脚本挂载逻辑。Flyway默认只会读取/flyway/sql下符合命名规范的迁移文件,找不到文件就会触发报错。
另外你当前Job的command写法存在Shell解析风险,建议拆分为command+args的标准写法避免执行异常。
修复方案1:ConfigMap挂载(适合少量脚本场景)
- 首先确保迁移脚本命名符合Flyway规范,格式为
V<版本号>__<描述>.sql,例如你现有的脚本可以命名为V1__create_transaction_events_table.sql - 本地执行命令创建存储迁移脚本的ConfigMap:
kubectl create configmap flyway-migration-scripts --from-file=./migrations/sql/
- 修改Flyway Job配置,增加挂载逻辑,修改后完整配置如下:
apiVersion: batch/v1 kind: Job metadata: name: flyway-migration-job spec: template: spec: containers: - name: flyway image: flyway/flyway:6.3.1 command: ["flyway"] args: ["-url=jdbc:postgresql://postgres-master:5432/wallet", "-user=test_user", "-password=testuser1234", "-connectRetries=60", "migrate"] volumeMounts: - name: sql-scripts mountPath: /flyway/sql volumes: - name: sql-scripts configMap: name: flyway-migration-scripts restartPolicy: Never backoffLimit: 1
如果之前ConfigMap方案失效,可先执行kubectl describe configmap flyway-migration-scripts确认脚本是否正确存入,也可以启动临时Pod挂载ConfigMap验证路径是否正确。
修复方案2:自定义Flyway镜像(适合脚本多、需版本管理的场景)
编写自定义Flyway镜像的Dockerfile:
FROM flyway/flyway:6.3.1 COPY ./migrations/sql/* /flyway/sql/
构建镜像后导入kind集群,再将Job中的镜像替换为你自定义的镜像即可,无需额外挂载配置。
内容的提问来源于stack exchange,提问作者befoca1956
相关产品推荐
相关产品推荐

