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
相关产品推荐
相关产品推荐

