Docker Compose中使用Evolve迁移MariaDB时遇命令参数错误
问题:Docker Compose中Evolve执行MariaDB迁移报错"Unrecognized command or argument 'mariadb'"
问题背景
为搭建模拟生产环境的本地开发环境,尝试在Docker Compose中使用Evolve进行MariaDB数据库迁移,期望每次启动Docker Compose时自动执行表结构变更迁移。此前使用docker-entrypoint-initdb.d方案,但该方式需要重启数据库才能生效,会导致卷中的持久化数据丢失,因此改用Evolve方案。
当前Docker Compose配置中,除migrate服务外其他容器均可正常启动,但migrate服务报错:
Unrecognized command or argument 'mariadb'
解决方案
1. 修正Evolve命令格式
错误根源是命令中多余了mariadb参数,Evolve不需要将数据库类型作为migrate命令的独立参数,它会通过连接字符串自动识别数据库类型(MariaDB兼容MySQL驱动,Evolve可正常识别)。同时需修正连接字符串中的数据库地址,在Docker Compose网络中需使用服务名而非localhost。
修正后的migrate服务配置:
migrate: image: <base_url>/backend/evolve-bin:master command: evolve migrate -c "Server=database;Port=3306;Database=dockertestdb;Uid=root;Pwd=root;" -l "/tmp/migrations" depends_on: database: condition: service_healthy # 等待数据库服务完全就绪后再执行迁移 volumes: - ../Migrations:/tmp/migrations
2. 为MariaDB添加健康检查
确保数据库服务完全启动并就绪后,再执行迁移操作,避免因数据库未就绪导致的连接失败。给database服务添加健康检查配置:
database: image: mariadb:10.9 container_name: database ports: - "33061:3306" networks: - backend volumes: - ../../dockertest-data:/var/lib/mysql environment: MYSQL_ROOT_USER: root MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: dockertestdb healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s timeout: 30s retries: 5
关键说明
- 移除
mariadb参数:Evolve的migrate命令无需指定数据库类型,连接字符串已足够让Evolve识别目标数据库 - 数据库地址改为
database:Docker Compose网络中,容器可通过服务名直接访问对应服务,localhost指向migrate容器自身,无法连接到数据库容器 - 健康检查依赖:确保数据库服务完全就绪后再执行迁移,避免迁移操作因数据库未启动而失败
内容的提问来源于stack exchange,提问作者Mufas
相关产品推荐
相关产品推荐

