Docker Compose启动后数据库表自动重置问题的解决方案咨询
解决Docker Compose启动时数据库表被重置的问题
嘿,我懂你遇到的这个糟心问题——每次启动Docker Compose,数据库表就被清空,这其实是因为你的MySQL容器没有配置数据持久化,每次容器重启都会从头初始化数据库。
问题根源
看你的docker-compose.yaml里的MySQL服务配置,你只挂载了my.cnf配置文件,却没有挂载MySQL存储实际数据的核心目录(容器内默认路径是/var/lib/mysql)。Docker容器本身是临时性质的,一旦容器被销毁或重建,容器内未挂载到宿主机/持久化卷的文件都会直接丢失,这就是你的表被重置的核心原因。
解决步骤
只需要修改db服务的volumes配置,把数据目录挂载到你已经在文件末尾定义好的dbdata命名卷即可:
修改后的MySQL服务配置片段:
#MySQL Service db: image: mysql:5.7.22 container_name: mysql restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_ROOT_USER: root MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: root MYSQL_USER: root MYSQL_PASSWORD: root SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - ./docker/mysql/my.cnf:/etc/mysql/my.cnf - dbdata:/var/lib/mysql # 新增这行,用命名卷持久化数据 networks: - app-network
后续操作
- 先清理旧的容器和未使用的卷(如果不需要保留旧容器里的数据):
docker-compose down -v - 重新启动服务:
docker-compose up -d
这样之后,MySQL的数据就会存在dbdata这个本地卷里,下次启动容器时数据不会再丢失了。
可选方案(主机目录挂载)
如果你更习惯把数据存在宿主机的指定目录,也可以替换成主机目录挂载(注意要确保宿主机目录权限正确):
volumes: - ./docker/mysql/my.cnf:/etc/mysql/my.cnf - ./docker/mysql/data:/var/lib/mysql # 数据会存在宿主机的这个目录下
不过官方更推荐使用命名卷,因为它的管理更规范,不容易出现权限和路径混乱的问题。
内容的提问来源于stack exchange,提问作者fhidiroglu




