You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

后续操作

  1. 先清理旧的容器和未使用的卷(如果不需要保留旧容器里的数据):
    docker-compose down -v
    
  2. 重新启动服务:
    docker-compose up -d
    

这样之后,MySQL的数据就会存在dbdata这个本地卷里,下次启动容器时数据不会再丢失了。

可选方案(主机目录挂载)

如果你更习惯把数据存在宿主机的指定目录,也可以替换成主机目录挂载(注意要确保宿主机目录权限正确):

volumes:
  - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
  - ./docker/mysql/data:/var/lib/mysql  # 数据会存在宿主机的这个目录下

不过官方更推荐使用命名卷,因为它的管理更规范,不容易出现权限和路径混乱的问题。

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

火山引擎 最新活动