【问题标题】:How to create znode on a docker compose cluster using "command" in the compose file?如何使用 compose 文件中的“command”在 docker compose 集群上创建 znode?
【发布时间】:2020-10-15 15:49:37
【问题描述】:

我正在尝试创建一个 docker-compose 文件来运行 zookeeper 和 solr(3 节点集群 - 官方图像)。我正在尝试使用撰写文件中的“command”属性在zookeeper中定义一个znode。

command: bash -c "/apache-zookeeper-3.5.8-bin/bin/zkCli.sh -server zoo1:2181 create /solr '' && zkServer.sh start-foreground"

执行此命令的 zookeeper 节点不断崩溃。

我的 docker compose 文件是:

    version: '3.7'
services:
  zoo1:
    image: zookeeper:3.5
    container_name: zoo1
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    networks:
      - solr
    volumes:
      - 'zoo1_data:/data'

  zoo2:
    image: zookeeper:3.5
    container_name: zoo2
    restart: always
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
    networks:
      - solr
    volumes:
      - 'zoo2_data:/data'

  zoo3:
    image: zookeeper:3.5
    container_name: zoo3
    restart: always
    hostname: 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

  solr1:
    image: solr:8.3
    container_name: solr1
    ports:
     - "8981:8983"
    environment:
      - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181/solr
    volumes:
      - 'solr1varsolr:/var/solr'
    networks:
      - solr
    depends_on:
      - zoo1
      - zoo2
      - zoo3

  solr2:
    image: solr:8.3
    container_name: solr2
    ports:
     - "8982:8983"
    environment:
      - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181/solr
    volumes:
      - 'solr2varsolr:/var/solr'
    networks:
      - solr
    depends_on:
      - zoo1
      - zoo2
      - zoo3

  solr3:
    image: solr:8.3
    container_name: solr3
    ports:
     - "8983:8983"
    environment:
      - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181/solr
    volumes:
      - 'solr3varsolr:/var/solr'
    networks:
      - solr
    depends_on:
      - zoo1
      - zoo2
      - zoo3

networks:
  solr:
volumes:
  zoo1_data:
  zoo2_data:
  zoo3_data:
  solr1varsolr:
  solr2varsolr:
  solr3varsolr:

在我看来,负责在容器中启动 zookeeper 的命令的第二部分没有被执行,但我不知道为什么?还有其他方法可以实现吗?

已解决

找到原因了。命令选项中“zkServer.sh start-foreground”之前缺少“exec”。导致执行命令后容器被关闭。 感谢@Yoeri Van Nieuwerburg 提供用于比较的示例撰写文件。

工作撰写文件:

    version: '3.7'
services:
  zoo1:
    image: zookeeper:3.5
    container_name: zoo1
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    networks:
      - solr
    volumes:
      - 'zoo1_data:/data'

  zoo2:
    image: zookeeper:3.5
    container_name: zoo2
    restart: always
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
    networks:
      - solr
    volumes:
      - 'zoo2_data:/data'

  zoo3:
    image: zookeeper:3.5
    container_name: zoo3
    restart: always
    hostname: 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 '' && exec zkServer.sh start-foreground"
    networks:
      - solr
    volumes:
      - 'zoo3_data:/data'
    depends_on:
      - zoo1
      - zoo2

  solr1:
    image: solr:8.3
    container_name: solr1
    ports:
     - "8981:8983"
    environment:
      - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181/solr
    volumes:
      - 'solr1varsolr:/var/solr'
    networks:
      - solr
    depends_on:
      - zoo1
      - zoo2
      - zoo3

  solr2:
    image: solr:8.3
    container_name: solr2
    ports:
     - "8982:8983"
    environment:
      - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181/solr
    volumes:
      - 'solr2varsolr:/var/solr'
    networks:
      - solr
    depends_on:
      - zoo1
      - zoo2
      - zoo3

  solr3:
    image: solr:8.3
    container_name: solr3
    ports:
     - "8983:8983"
    environment:
      - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181/solr
    volumes:
      - 'solr3varsolr:/var/solr'
    networks:
      - solr
    depends_on:
      - zoo1
      - zoo2
      - zoo3

networks:
  solr:
volumes:
  zoo1_data:
  zoo2_data:
  zoo3_data:
  solr1varsolr:
  solr2varsolr:
  solr3varsolr:

【问题讨论】:

    标签: docker solr docker-compose apache-zookeeper


    【解决方案1】:

    我可能在这里遗漏了一些东西,但我不确定您为什么要尝试在 zookeeper 实例上“创建”solr 目录?
    Solr只是一个实例,连接zookeeper节点吧?
    或者您想在您的合奏中连接多个系统?如果是这样,我认为您应该查看this solr-doc,它正好显示了这一点(“使用 chroot”)。

    无论如何,如果您只是想在不使用 /solr 端点的情况下启动并运行它,下面是我的一个 zookeeper 节点在我的 docker-compose 中的样子(仅用于本地开发):

    zoo3:
        image: library/zookeeper:3.5.7
        container_name: zoo3
        restart: always
        hostname: zoo3
        ports:
          - 8384:8080
        environment:
          TZ: Europe/Paris
          ZOO_MY_ID: 3
          ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
        networks:
          - solr
        command: >
          sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && 
          echo $TZ > /etc/timezone &&
          sed -i 's/autopurge.purgeInterval=0/autopurge.purgeInterval=1/g' /conf/zoo.cfg  &&
          echo 4lw.commands.whitelist=mntr,conf,ruok >> /conf/zoo.cfg &&
          exec zkServer.sh start-foreground"
    

    您唯一需要在 solr-services 中更改的是 zoo3 的 url,从 zoo3:2181/solrzoo3:2181... 已经用于其他 2 个节点 ;)

    所有节点都使用相同的设置(当然除了命名和ZOO_SERVERS 环境变量:))

    希望这会有所帮助,如果没有,希望我没有让你感到困惑;)

    【讨论】:

    • 嗨,我想分享这个 zookeeper Ensemble 来托管其他应用程序,并将使用它来存储共享数据。为了正确隔离数据,我需要为每个应用程序 chroot "/appname"。我能够在没有 chroot 的情况下运行撰写文件。
    • 我通过对比你分享的compose文件找到了原因。我在命令选项中的“zkServer.sh start-foreground”之前缺少“exec”。谢谢
    • 嗯...好吧,当我试图启动并运行它时,我开始感受到你的痛苦......定义环境。 ZK_CHROOT 似乎没有为集群削减它:(
    • @mr-price,没问题...介意分享您的整个撰写文件吗? :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多