【问题标题】:Docker is not updating the database schema when i use bind mounts as volumes to store database data even when the container destroyed当我使用绑定挂载作为卷来存储数据库数据时,Docker 不会更新数据库架构,即使容器被破坏也是如此
【发布时间】:2025-12-03 22:45:01
【问题描述】:

最初,我创建了一个以 mysql 8 作为基础映像的测试 mysql 映像,并将 .sql 文件放在入口点 /docker-entrypoint-initdb 中。 d/ 图片。

成功构建镜像后。使用以下命令执行该图像的容器

docker run -d --rm --name mysql_test_container_old --net=host -v /home/user/mysql_data:/var/lib/mysql mysql_test_image:v1.0

在这个容器中有两张表,外部应用程序将访问数据库并插入一些数据。

我使用以下命令停止了容器

   docker stop mysql_test_container

更新了 mysql_test_image 中的架构,在架构中添加了一个表,并使用新标签 v1.1 构建为 mysql_test_image:v1.1

在这种情况下,我想通过使用卷来恢复最后两个表的数据,并希望创建新表,我已使用该表更新了新标签中的架构。 我正在尝试通过使用以下命令来实现这一目标

docker run -d --rm --name mysql_test_container_new --net=host -v /home/user/mysql_data:/var/lib/mysql mysql_test_image:v1.1

mysql_test_container_new 并未执行包含三个表的新 .sql 文件,而不仅仅是从卷中复制旧属性。

所以当我去查看 mysql_test_container_new 时,我只能看到两个带有数据的旧表,而新标记图像的架构中提到的新表没有创建.

我不确定这是否可行,或者我应该知道我是否以错误的方式尝试它? 提前致谢

【问题讨论】:

  • 查看是否有适用于您的应用程序框架的数据库迁移工具。这将被设计为执行诸如向现有数据库添加新表之类的任务,并且它不是特定于 Docker 的。

标签: mysql docker dockerfile docker-volume


【解决方案1】:

docker-entrypoint-initdb.d 中的脚本只在数据库初始化上运行,即启动容器时没有数据库。

因此,当您第一次运行容器时,它们就会运行。但是在第二次运行时,那里已经有一个数据库,所以没有进行初始化。

如果需要修改数据库,必须自己动手。

【讨论】:

  • 感谢您的快速回复,有什么方法我想修改数据库并想立即恢复旧数据
  • 根据您要进行的更改,如何进行可能会有所不同。也许您需要创建一个新表或 ALTER 一个现有表。也许您需要保存数据,修改表并再次加载。很难制定一个适用于所有迁移的流程。