修改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
相关产品推荐
相关产品推荐

