You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改seed sql后重建Docker MySQL镜像,变更为何被忽略?

为什么修改seed.sql后Docker重建镜像但数据库数据还是旧的?

核心原因

  • 修改seed.sql后执行docker compose up --build -d my-database,确实会触发镜像重建(COPY指令检测到文件变化,缓存失效),新镜像内的seed.sql是更新后的内容。
  • MySQL官方镜像的初始化逻辑有严格触发条件:仅当数据库数据卷(存储/var/lib/mysql的卷)首次创建时,才会执行/docker-entrypoint-initdb.d/目录下的脚本。后续启动容器时,只要数据卷存在,就会直接加载已有数据库数据,完全跳过初始化步骤。
  • 你第一次启动容器时,Docker自动创建了存储MySQL数据的匿名卷,后续即使重建镜像、重启容器,这个数据卷依然保留着旧数据,因此新的seed.sql脚本不会被执行,数据库里还是旧值70。
  • 执行docker compose rm my-database会删除容器及关联的匿名数据卷,下次启动时会重新创建空的数据卷,此时才会执行更新后的seed.sql,数据才会变为71。

解决办法

如果需要每次修改seed.sql都重新初始化数据,可选择以下方式:

  • 启动前彻底清理数据卷:执行docker compose down -v my-database(-v参数会删除服务关联的数据卷),再执行docker compose up --build -d my-database。
  • 显式声明命名数据卷,方便管理:
    my-database:
      build: my-database
      environment:
        - MYSQL_ROOT_PASSWORD
      volumes:
        - mysql-data:/var/lib/mysql
    volumes:
      mysql-data:
    
    需要更新数据时,执行docker volume rm <你的项目名>_mysql-data,再重新启动容器。
  • 改用数据库迁移工具(如Flyway、Liquibase)管理数据变更,这类工具支持增量更新,可在容器每次启动时自动执行未应用的迁移脚本,无需删除数据卷。

相关问题

/docker-entrypoint-initdb.d目录下的脚本被忽略

内容的提问来源于stack exchange,提问作者sashoalm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:12:44