You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:57:22