Docker Compose启动MySQL服务时出现Operation not permitted错误
MySQL容器启动报错:chown: changing ownership of '/var/lib/mysql/ib_buffer_pool': Operation not permitted
问题场景
我使用如下Docker Compose文件部署服务:
version: '4' services: app: container_name: myapp restart: unless-stopped build: context: ./ dockerfile: Dockerfile working_dir: /var/www/html volumes: - ./src:/var/www/html nginx: container_name: myapp_nginx image: nginx:latest restart: unless-stopped ports: - 8080:80 volumes: - ./src:/var/www/html depends_on: - app db: image: mysql:8 container_name: myapp_db restart: unless-stopped command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci'] user: mysql ports: - 3306:3306 volumes: - ./data/mysql:/var/lib/mysql:rw environment: MYSQL_DATABASE: "myapp_db" MYSQL_ROOT_PASSWORD: "myrootpass" networks: default: name: app-network driver: bridge
其中app和nginx服务启动正常,但db(MySQL)服务抛出错误:
chown: changing ownership of '/var/lib/mysql/ib_buffer_pool': Operation not permitted
错误原因
- 你在db服务中指定了
user: mysql,但宿主机的./data/mysql目录权限属于当前主机用户(非容器内的mysql用户),容器内的mysql用户没有权限修改宿主机目录下文件的所有权,导致初始化时执行chown操作失败。 - 额外提示:Docker Compose的version字段你写的是
4,但目前Docker Compose最高稳定版本为3.x,该版本号不合法(不过这不是当前错误的直接原因,建议修正)。
解决方法
方案1:移除user: mysql配置
MySQL官方镜像默认以root用户启动,初始化完成后会自动切换为mysql用户运行进程。移除该配置后,容器内的root用户有权限修改挂载目录的文件权限,初始化完成后自动降权,不影响安全性。
修改后的db服务配置片段:
db: image: mysql:8 container_name: myapp_db restart: unless-stopped command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci'] # 移除 user: mysql 这一行 ports: - 3306:3306 volumes: - ./data/mysql:/var/lib/mysql:rw environment: MYSQL_DATABASE: "myapp_db" MYSQL_ROOT_PASSWORD: "myrootpass"
方案2:修改宿主机挂载目录权限
如果必须保留user: mysql配置,需要让宿主机的./data/mysql目录属于容器内mysql用户对应的UID(MySQL8镜像中mysql用户的UID通常为999)。
执行以下命令:
# 创建目录(若不存在) mkdir -p ./data/mysql # 修改目录权限为UID 999 sudo chown -R 999:999 ./data/mysql
之后重新启动容器:
docker-compose down && docker-compose up -d
方案3:使用命名卷替代主机目录挂载
命名卷由Docker管理,会自动处理权限问题,无需手动调整。修改db服务的volumes配置并添加命名卷定义:
db: # 其他配置保持不变 volumes: # 替换为命名卷 - mysql_data:/var/lib/mysql:rw # 在compose文件末尾添加命名卷定义 volumes: mysql_data:
内容的提问来源于stack exchange,提问作者Ask17
相关产品推荐
相关产品推荐

