如何在Docker中设置Zookeeper的dataDir(fig.yml)

我已经为Dockerconfiguration了一个fig.yml文件中的Zookeeper和Kafka容器。 两个容器都能正常工作 但是在发送了一些消息之后,我的应用程序/ zk-client挂起了。 在检查zookeeper日志时,我看到错误:

Error Path:/brokers Error:KeeperErrorCode = NoNode for /brokers

我的fig.yml如下所示:

 zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" environment: ZK_ADVERTISED_HOST_NAME: xx.xx.x.xxx ZK_CONNECTION_TIMEOUT_MS: 6000 ZK_SYNC_TIME_MS: 2000 ZK_DATADIR: /path/to/data/zk/data/dir kafka: image: wurstmeister/kafka:0.8.2.0 ports: - "xx.xx.x.xxx:9092:9092" links: - zookeeper:zk environment: KAFKA_ADVERTISED_HOST_NAME: xx.xx.x.xxx KAFKA_LOG_DIRS: /home/svc_cis4/dl volumes: - /var/run/docker.sock:/var/run/docker.sock 

我已经search了很长一段时间,但我还没有得到解决scheme。 我也尝试使用ZK_DATADIR设置fig.yml中的数据目录:'/ path / to / zk / data / dir',但似乎没有帮助。 任何援助将不胜感激。

UPDATE

/opt/kafka_2.10-0.8.2.0/config/server.properties内容:

 broker.id=0 port=9092 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 num.partitions=1 num.recovery.threads.per.data.dir=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 log.cleaner.enable=false zookeeper.connect=localhost:2181 zookeeper.connection.timeout.ms=6000 

您遇到的问题与zookeeper的数据目录无关。 错误Error Path:/brokers Error:KeeperErrorCode = NoNode for /brokers是由于您的应用程序无法在zookeeper的数据中find任何broker znode。 这可能是因为kafka容器没有正确连接到zookeeper,并且正在查看wurstmeister的图像,我认为这个问题可能与variablesKAFKA_ADVERTISED_HOST_NAME有关。 我不知道是否有理由通过必须传递的envvariables来赋值该variables,但从我的angular度来看,这不是一个好方法。 有多种方式来configurationkafka(事实上,不需要设置advertised.host.name ,你可以留下它的评论和kafka将默认主机名,可以设置与docker),但一个快速的解决scheme,将是编辑start-kafka.sh并重build图片:

 #!/bin/bash if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then export KAFKA_ADVERTISED_PORT=$(docker port `hostname` 9092 | sed -r "s/.*:(.*)/\1/g") fi if [[ -z "$KAFKA_BROKER_ID" ]]; then export KAFKA_BROKER_ID=$KAFKA_ADVERTISED_PORT fi if [[ -z "$KAFKA_LOG_DIRS" ]]; then export KAFKA_LOG_DIRS="/kafka/kafka-logs-$KAFKA_BROKER_ID" fi if [[ -z "$KAFKA_ZOOKEEPER_CONNECT" ]]; then export KAFKA_ZOOKEEPER_CONNECT=$(env | grep ZK.*PORT_2181_TCP= | sed -e 's|.*tcp://||' | paste -sd ,) fi if [[ -n "$KAFKA_HEAP_OPTS" ]]; then sed -r -i "s/^(export KAFKA_HEAP_OPTS)=\"(.*)\"/\1=\"$KAFKA_HEAP_OPTS\"/g" $KAFKA_HOME/bin/kafka-server-start.sh unset KAFKA_HEAP_OPTS fi for VAR in `env` do if [[ $VAR =~ ^KAFKA_ && ! $VAR =~ ^KAFKA_HOME ]]; then kafka_name=`echo "$VAR" | sed -r "s/KAFKA_(.*)=.*/\1/g" | tr '[:upper:]' '[:lower:]' | tr _ .` env_var=`echo "$VAR" | sed -r "s/(.*)=.*/\1/g"` if egrep -q "(^|^#)$kafka_name=" $KAFKA_HOME/config/server.properties; then sed -r -i "s@(^|^#)($kafka_name)=(.*)@\2=${!env_var}@g" $KAFKA_HOME/config/server.properties #note that no config values may contain an '@' char else echo "$kafka_name=${!env_var}" >> $KAFKA_HOME/config/server.properties fi fi done ###NEW### IP=$(hostname --ip-address) sed -i -e "s/^advertised.host.name.*/advertised.host.name=$IP/" $KAFKA_HOME/config/server.properties ###END### $KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties 

如果这不能解决你的问题,你可以得到更多的信息在容器内启动一个会话(例如: docker exec -it kafkadocker_kafka_1 /bin/bash for kafka's和docker exec -it kafkadocker_zookeeper_1 /bin/bash for zookeeper's) kafka日志或zookeeper控制台( /opt/zookeeper-3.4.6/bin/zkCli.sh

过去两天没有任何问题的configuration一直在为我工作,包括为Zookeeper和Kafka指定主机地址。 我的fig.yml内容是:

 zookeeper: image: wurstmeister/zookeeper ports: - "xx.xx.x.xxx:2181:2181" kafka: image: wurstmeister/kafka:0.8.2.0 ports: - "9092:9092" links: - zookeeper:zk environment: KAFKA_ADVERTISED_HOST_NAME: xx.xx.x.xxx KAFKA_NUM_REPLICA_FETCHERS: 4 ...other env variables... volumes: - /var/run/docker.sock:/var/run/docker.sock validator: build: . volumes: - .:/host entrypoint: /bin/bash command: -c 'java -jar /host/app1.jar' links: - zookeeper:zk - kafka analytics: build: . volumes: - .:/host entrypoint: /bin/bash command: -c 'java -jar /host/app2.jar' links: - zookeeper:zk - kafka loader: build: . volumes: - .:/host entrypoint: /bin/bash command: -c 'java -jar /host/app3.jar' links: - zookeeper:zk - kafka 

和相关的Dockerfile内容:

 FROM ubuntu:trusty MAINTAINER Wurstmeister RUN apt-get update; apt-get install -y unzip openjdk-7-jdk wget git docker.io RUN wget -q http://apache.mirrors.lucidnetworks.net/kafka/0.8.2.0/kafka_2.10-0.8.2.0.tgz -O /tmp/kafka_2.10-0.8.2.0.tgz RUN tar xfz /tmp/kafka_2.10-0.8.2.0.tgz -C /opt VOLUME ["/kafka"] ENV KAFKA_HOME /opt/kafka_2.10-0.8.2.0 ADD start-kafka.sh /usr/bin/start-kafka.sh ADD broker-list.sh /usr/bin/broker-list.sh CMD start-kafka.sh