如何在docker-compose创建的MySQL容器中使用本地已有MySQL数据
问题原因
- 权限不匹配:官方MySQL 5.6镜像默认使用uid为999、gid为999的
mysql用户运行进程,你的本地数据目录/usr/local/mysql/data的所有者为本地环境的mysql用户或root用户,容器内进程无读取权限,因此MySQL启动时无法识别原有数据,会自动在挂载目录初始化一套全新的空数据文件,所以连接后看不到原有数据库。 - 版本不兼容风险:如果本地原部署的MySQL大版本不是5.6,跨版本直接挂载数据目录会导致数据无法被识别。
解决步骤
- 第一步:备份本地原有数据,防止操作失误导致数据丢失
执行命令:cp -rp /usr/local/mysql/data /usr/local/mysql/data_bak - 第二步:调整本地数据目录的所有者权限,匹配容器内mysql用户的uid/gid
执行命令:chown -R 999:999 /usr/local/mysql/data - 第三步:修改docker-compose.yml配置,显式指定容器运行MySQL的用户身份,新增
user配置项,修改后完整配置如下:db: image: mysql:5.6 container_name: mysql ports: - "3306:3306" environment: MYSQL_ALLOW_EMPTY_PASSWORD: 1 user: "999:999" volumes: - /usr/local/mysql/data:/var/lib/mysql - 第四步:删除原有异常容器,重新启动服务
执行命令:docker-compose down docker-compose up -d
验证方式
启动完成后连接MySQL,即可看到原有数据库内容。
注意事项
- 必须保证本地原有MySQL的大版本和容器使用的
mysql:5.6镜像版本完全一致,否则会出现数据无法读取甚至损坏的问题 - 如果是Windows/Mac环境使用Docker Desktop,需要先在Docker Desktop的文件共享设置中开放
/usr/local/mysql目录的挂载权限,否则挂载会失效 - 不要在MySQL实例运行状态下修改本地数据目录内的文件,避免数据损坏
- 如果是Linux系统且开启了SELinux,执行完权限修改后仍无法读取数据,可执行
chcon -Rt svirt_sandbox_file_t /usr/local/mysql/data给目录添加SELinux访问标签
内容的提问来源于stack exchange,提问作者yourknightmares
相关产品推荐
相关产品推荐

