Flyway作业未执行命令

Posted

技术标签:

【中文标题】Flyway作业未执行命令【英文标题】:Flyway job is not executing command 【发布时间】:2021-11-08 16:09:12 【问题描述】:

问题

我有一个 flyway 工作,旨在对 postgres 数据库执行迁移。 该作业似乎没有运行命令,并且检查作业日志仅输出飞行路线文档。

期望

我希望日志检查是所发生迁移的概要。 我还安装了 pgweb 以实现可观察性,并且在连接到我的 postgres pod 后,很明显根本没有创建任何表。

这是 kubectl logs flyway-pod 预期输出的照片

我得到了什么

这是 kubectl logs flyway-pod 的输出 如您所见,它打印的是使用指南,而不是迁移发生的标志。

我尝试过的-解释

到目前为止,我一直在移动连接命令。

我已经注释掉了我尝试放置命令的位置。 我在 3 个地方都试过了。

    在原始 Flyway Dockerfile 中,别无其他。 在 flyway 服务附近的 docker compose 文件中,其他任何地方都没有。 在 Kubernetes Flyway 工作中,别无他处。

代码

这是我的文件和设置。

Kubernetes 文件

以下是用于设置我的集群的相关 Kubernetes 文件。

Flyway 工作:

这是 Flyway 作业:

kind: Job
metadata:
  name: flyway-migration-job
spec:
  template:
    spec:
      containers:
      - name: flyway
        image: flyway/flyway:6.3.1
        command: ["flyway", "-url=jdbc:postgresql://postgres-master:5432/wallet", "-user=test_user", "-password=testuser1234", "-schemas=wallet", "-connectRetries=60 migrate"]
      restartPolicy: OnFailure

Postgres 部署与服务

Postgres 部署文件

kind: Deployment
metadata:
  name: postgres-master
  labels:
    app: postgres-master
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-master
  template:
    metadata:
      labels:
        app: postgres-master
    spec:
      containers:
        - name: postgres-master
          image: postgres:13
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: wallet
            - name: POSTGRES_USER
              value: test_user
            - name: POSTGRES_PASSWORD
              value: testuser1234
      

Postgres 服务

apiVersion: v1
kind: Service
metadata:
  name: postgres-master
  labels: 
    app: postgres-master
spec: 
  type: NodePort
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  selector: 
    app: postgres-master

Docker 文件

当我在本地构建图像并使用 kind 将它们拉入集群时,我将附加相关的 Dockerfile。

Flyway Dockerfile

FROM flyway/flyway:7.7.3-alpine

COPY ./migrations/sql /flyway/sql/

#CMD ["flyway -url=jdbc:postgresql://postgres-master:5432/wallet -user=test_user -password=testuser1234  -connectRetries=60 -schemas=wallet migrate"]

Flyway SQL 脚本

此脚本存储在 migrations/sql 中

CREATE TABLE wallet.transaction_events (
    transaction_version int,
    transaction_type VARCHAR(200),
    coins int,
    transaction_id VARCHAR(500),
    wallet_id VARCHAR(500)
)

Docker 编写

这是我在拉入 kind/my 集群之前用来构建图像的 docker compose 文件。

version: '3.5'
services:
  web:
    build:
      dockerfile: ./Dockerfile
    container_name: wallet-api-web
    depends_on: 
      - flyway
    ports: 
      - "8080:8080"
  postgres-db:
    build:
      dockerfile: ./utils/db.Dockerfile
    container_name: postgres-db
    environment:
      POSTGRES_PASSWORD: testuser1234
      POSTGRES_USER: test_user
      POSTGRES_DB: wallet
    image: postgres:13
    ports:
      - "5432:5432"
    restart: always

  flyway:
    build:
      dockerfile: ./migrations/Dockerfile
    #command: -url=jdbc:postgresql://postgres-master:5432/wallet -user=test_user -password=testuser1234 -schemas=wallet -connectRetries=60 migrate 
    container_name: flyway-migrations
    depends_on:
      - db
    image: flyway/flyway:6.3.1
    volumes:
      - $PWD/migrations/sql:/flyway/sql

我想我已经涵盖了为我的问题提供上下文所需的所有内容,但如果需要任何说明,请随时询问。

对于让这些迁移正常工作的任何帮助,我非常感激。 谢谢

【问题讨论】:

Please do not upload images of code/errors when asking a question. 【参考方案1】:

你的命令是数组语法,这意味着每个参数必须是一个单独的元素。 你在最后一个元素中有两个参数,flyway不理解。

修复:

"-connectRetries=60 migrate"]

改成

"-connectRetries=60", "migrate"]

【讨论】:

以上是关于Flyway作业未执行命令的主要内容,如果未能解决你的问题,请参考以下文章

flyway 命令行工具 - 重新执行失败的 DDL 的选项是啥?

Kubernetes - 使用 flyway 作业在 postgres 数据库上执行迁移 - 连接问题

Flyway 学习时遇到的错误

Flyway Java 迁移在命令行工具中不起作用

Pentaho 作业未通过运行批处理文件执行

flyway - 校验和概念的含义