问题描述
在尝试使用Docker来发布MySQL 5.7时,尽管我的Dockerfile中包含了初始化数据库的SQL脚本,但数据库并未被创建。
dockerfile 如下
FROM mysql:5.7
MAINTAINER zhang
ADD ./db/*.sql /docker-entrypoint-initdb.d/
问题原因
Docker MySQL镜像使用了一个特殊的初始化脚本,该脚本会检查/docker-entrypoint-initdb.d/目录下的SQL文件并在容器启动时执行它们。但是,如果/var/lib/mysql目录(即MySQL的数据目录)已存在并且包含数据库文件(这通常发生在通过挂载卷或持久化数据的情况下),则初始化脚本会跳过/docker-entrypoint-initdb.d/目录下的所有操作。
问题解决
为了解决这个问题,并确保数据库被正确初始化,你需要确保/var/lib/mysql目录在容器启动时是空的,或者不包含任何现有的数据库文件。
步骤 1:备份现有数据(如果适用)
如果/var/lib/mysql目录包含重要的数据库数据,你首先需要备份这些数据。你可以通过复制或打包该目录来完成这一步骤。
步骤 2:删除或清空/var/lib/mysql目录
如果你正在使用Docker Compose或直接在宿主机上运行Docker容器,并且已经将数据卷挂载到/var/lib/mysql,你需要删除或清空该数据卷中的文件
rm -rf ./mysql/data
步骤 3:重新创建容器
一旦你清除了或备份了/var/lib/mysql目录中的数据,你就可以重新创建容器了。这可以通过Docker Compose的docker-compose up命令或使用Docker CLI的docker run命令来完成。
注意事项
在处理生产环境的数据时,请始终谨慎行事,并确保你已经备份了所有重要的数据。
当你重新创建容器时,确保你的Dockerfile和任何相关的配置文件都是最新的,并且包含了所有必要的更改。
如果你使用的是Docker Compose,并且你的配置文件中包含了多个服务,请确保只删除或修改与MySQL服务相关的部分。