如何在Docker Compose集群中通过command创建ZNode并解决容器崩溃
解决Docker Compose部署ZooKeeper+Solr集群时ZooKeeper容器崩溃的问题
我刚帮你排查了这个ZooKeeper容器反复崩溃的问题,核心原因和解决方案都梳理清楚了,咱们一步步说:
问题根源
你原来给zoo3配置的启动命令是:
bash -c "/apache-zookeeper-3.5.8-bin/bin/zkCli.sh -server zoo2:2181 create /solr '' && zkServer.sh start-foreground"
这里的关键问题是:当用bash -c执行命令串时,最后启动的zkServer.sh start-foreground是bash进程的子进程。而Docker容器的生命周期是和PID为1的进程绑定的——只要PID1进程(这里是bash)执行完所有命令,不管子进程还在不在,容器都会直接终止。
所以哪怕ZooKeeper服务已经启动,只要bash完成了命令序列,容器就会跟着崩溃,看起来就像ZooKeeper没启动一样。
解决方案:添加exec关键字
在zkServer.sh start-foreground前加上exec,就能让ZooKeeper进程直接替换掉当前的bash进程,成为容器的PID1进程。这样Docker容器的生命周期就会和ZooKeeper服务绑定,只要ZooKeeper在运行,容器就不会退出。
修正后的启动命令:
bash -c "/apache-zookeeper-3.5.8-bin/bin/zkCli.sh -server zoo2:2181 create /solr '' && exec zkServer.sh start-foreground"
完整配置对比
原问题配置(zoo3服务片段)
zoo3: image: zookeeper:3.5 container_name: zoo3 ports: - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181 ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok # 有问题的命令 command: bash -c "/apache-zookeeper-3.5.8-bin/bin/zkCli.sh -server zoo2:2181 create /solr '' && zkServer.sh start-foreground" networks: - solr volumes: - 'zoo3_data:/data' depends_on: - zoo1 - zoo2
修正后配置(zoo3服务片段)
zoo3: image: zookeeper:3.5 container_name: zoo3 ports: - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181 ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok # 添加exec后的正确命令 command: bash -c "/apache-zookeeper-3.5.8-bin/bin/zkCli.sh -server zoo2:2181 create /solr '' && exec zkServer.sh start-foreground" networks: - solr volumes: - 'zoo3_data:/data' depends_on: - zoo1 - zoo2
额外小提示
- 只需要在一个ZooKeeper节点上创建
/solrZNode即可,因为ZooKeeper集群会自动同步数据到所有节点,不用重复执行创建命令。 depends_on仅保证容器启动顺序,不能确保ZooKeeper服务完全就绪。如果要更严谨,可以给ZooKeeper添加健康检查,或者在创建ZNode的命令里加重试逻辑,避免集群未就绪时创建失败。
内容的提问来源于stack exchange,提问作者mr-price
相关产品推荐
相关产品推荐

