Docker部署MySQL镜像无法启动数据库问题求助
问题现象
1. Docker Compose配置
db: image: "mysql:8.0.33" container_name: mywebsite-sql volumes: - .docker/mysql:/var/lib/mysql/ restart: unless-stopped environment: - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD}
2. 容器运行异常
执行docker compose up后容器显示运行状态,但内部MySQL服务未启动,容器日志输出:
2023-11-26 23:22:45+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1.el8 started. 2023-11-26 23:22:46+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
进入容器执行mysql命令时报错:
sh-4.4# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
手动在容器内启动mysqld时出现以下错误:
sh-4.4# mysqld 2023-12-05T23:11:02.618578Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. 2023-12-05T23:11:02.626541Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.33) starting as process 61 2023-12-05T23:11:02.631689Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive 2023-12-05T23:11:02.667038Z 1 [ERROR] [MY-011011] [Server] Failed to find valid data directory. 2023-12-05T23:11:02.667419Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2023-12-05T23:11:02.667481Z 0 [ERROR] [MY-010119] [Server] Aborting 2023-12-05T23:11:02.669140Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.33) MySQL Community Server - GPL.
补充说明
即使不挂载本地卷,直接执行官方文档命令docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest,也会出现相同问题,设备为Apple M2。
解决方法
使用适配ARM架构的MySQL镜像:Apple M2为ARM64架构,部分官方镜像存在兼容性问题,可改用多架构支持的镜像
mysql/mysql-server:8.0.33,或指定ARM专属标签mysql:8.0.33-arm64。更新后的compose配置示例:db: image: "mysql/mysql-server:8.0.33" container_name: mywebsite-sql volumes: - .docker/mysql:/var/lib/mysql/ restart: unless-stopped environment: - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD}清理损坏的本地数据目录:如果挂载的本地目录
.docker/mysql存在损坏数据,先删除该目录:rm -rf .docker/mysql之后重新启动容器,让MySQL初始化新的合法数据目录。
检查Docker文件共享权限:打开Docker Desktop → 设置 → Resources → File Sharing,确保项目所在目录已添加到共享列表,且权限正常。
禁用新虚拟化框架(可选):部分M系列Mac用户反馈,关闭Docker的新虚拟化框架可解决文件系统相关问题:打开Docker Desktop → 设置 → Features in development,取消勾选"Use the new Virtualization framework",重启Docker后再尝试启动容器。
内容的提问来源于stack exchange,提问作者Furman

