如何用Docker启动并初始化MySQL 8?解决权限拒绝报错问题
解决MySQL容器权限错误:/var/lib/mysql/auto.cnf 权限拒绝
问题场景
使用M1芯片Mac,通过docker buildx build --platform linux/amd64 --load -t mysqltest -f path/to/Dockerfile .构建amd64架构的MySQL镜像,执行docker-compose up时持续报错:
mysqld: File '/var/lib/mysql/auto.cnf' not found (OS errno 13 - Permission denied)
相关配置文件:
Dockerfile
FROM mysql/mysql-server:8.0.32 # 初始化环境变量 ENV MYSQL_ROOT_PASSWORD=test_password ENV MYSQL_DATABASE=new_database ENV MYSQL_USER=user ENV MYSQL_PASSWORD=test_password RUN microdnf update && microdnf -y install vim EXPOSE 3306 CMD ["mysqld"]
docker-compose.yml
version: "3.7" networks: backend: driver: ${NETWORKS_DRIVER} services: db: image: mysqltest container_name: db build: context: . dockerfile: ./path/to/Dockerfile restart: always env_file: - .env ports: - "3306:3306" expose: - "3306" volumes: - db-volume:/var/lib/mysql - ./docker/db/sql-scripts:/docker-entrypoint-initdb.d/ - ./docker/db/configs:/etc/mysql networks: - backend volumes: db-volume:
原因分析
- 跨平台构建权限不兼容:M1 Mac为arm64架构,构建amd64镜像后,挂载的命名卷或本地目录权限与容器内mysql用户(UID 27)不匹配。
- 本地挂载目录权限错误:
./docker/db/configs和./docker/db/sql-scripts的主机权限未适配容器内mysql用户。 - 旧命名卷残留异常:之前运行失败的容器可能在
db-volume中留下了权限错误的文件。
解决方案
1. 清理旧命名卷并重新构建
彻底移除旧容器和卷,再重新启动:
docker-compose down -v docker-compose up --build
2. 修正本地挂载目录权限
在主机上为本地挂载目录设置匹配容器内mysql用户的权限(UID 27):
sudo chown -R 27:27 ./docker/db/configs ./docker/db/sql-scripts
3. 在docker-compose中指定构建平台
无需手动使用buildx,直接在compose配置中指定amd64平台,确保构建和运行的权限一致性:
修改docker-compose.yml中db服务的build部分:
build: context: . dockerfile: ./path/to/Dockerfile platform: linux/amd64
然后执行:
docker-compose up --build
4. 移除不必要的配置挂载
如果无需自定义MySQL配置,删除- ./docker/db/configs:/etc/mysql这一行挂载,使用镜像默认的配置目录,避免权限冲突。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

