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

Docker-Compose部署ZooKeeper和Kafka遇目录权限错误求助

问题:Docker-Compose部署ZooKeeper与Kafka时出现目录可写性检查失败

我尝试通过docker-compose部署ZooKeeper和Kafka容器,使用的docker-compose.yml配置如下:

version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    volumes:
      - /srv/zookeeper_data:/var/lib/zookeeper/data
      - /srv/zookeeper_log:/var/lib/zookeeper/log

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092,PLAINTEXT://192.168.100.9:9092"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    volumes:
      - /srv/kafka_data:/var/lib/kafka/data

执行docker-compose build和docker-compose up后,控制台输出以下错误:

zookeeper_1         | ===> Running preflight checks ...
zookeeper_1         | ===> Check if /var/lib/zookeeper/data is writable ...
zookeeper_1         | Command [/usr/local/bin/dub path /var/lib/zookeeper/data writable] FAILED !
zookeeper_1 exited with code 1
kafka_1             | ===> Running preflight checks ...
kafka_1             | ===> Check if /var/lib/kafka/data is writable ...

已确认/srv/kafka_data、/srv/zookeeper_data和/srv/zookeeper_log目录均存在,请问如何解决该问题?


解决方案

这个错误是因为容器内运行ZooKeeper和Kafka的进程没有宿主机挂载目录的写入权限,可通过以下几种方式解决:

1. 调整宿主机目录权限

Confluent的ZooKeeper镜像默认使用zookeeper用户(UID 1000)运行,Kafka镜像默认使用kafka用户(UID 1001)运行。直接给宿主机挂载目录设置对应UID的权限即可:

# 设置ZooKeeper目录权限
sudo chown -R 1000:1000 /srv/zookeeper_data /srv/zookeeper_log
# 设置Kafka目录权限
sudo chown -R 1001:1001 /srv/kafka_data

如果是测试环境,也可以临时给所有用户开放写入权限(生产环境不推荐):

sudo chmod -R 777 /srv/zookeeper_data /srv/zookeeper_log /srv/kafka_data

2. 在docker-compose.yml中指定运行用户

可以直接在服务配置中指定用户,让容器以拥有目录权限的用户运行:

方式一:使用root用户(快速测试,生产不推荐)

修改docker-compose.yml,给zookeeper和kafka服务添加user参数:

version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    volumes:
      - /srv/zookeeper_data:/var/lib/zookeeper/data
      - /srv/zookeeper_log:/var/lib/zookeeper/log
    user: "root"  # 添加该行

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092,PLAINTEXT://192.168.100.9:9092"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    volumes:
      - /srv/kafka_data:/var/lib/kafka/data
    user: "root"  # 添加该行

方式二:使用对应UID的用户(生产推荐)

直接指定镜像默认使用的UID,避免权限问题:

version: '3'
services:
  zookeeper:
    ...
    user: "1000:1000"  # zookeeper用户的UID:GID
    ...

  kafka:
    ...
    user: "1001:1001"  # kafka用户的UID:GID
    ...

3. 重启容器

完成权限调整或配置修改后,重启容器生效:

docker-compose down
docker-compose up -d

内容的提问来源于stack exchange,提问作者therepanic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:57:09