【问题标题】:how to run feedconsumers and consumers multiple for kafka in docker?如何在docker中为kafka运行多个feedconsumers和consumers?
【发布时间】:2021-02-21 21:48:49
【问题描述】:

所以我有这个 docker 文件,我想多次运行 feed-consumers 和 consumer,我尝试这样做。我们有一个用于 feed-consumers 和 consumer 的 node.js 应用程序,并将 user_levels 传递给它。

我只想问这是正确的方法吗?

FROM ubuntu:18.04
# Set Apt to noninteractive mode
ENV DEBIAN_FRONTEND noninteractive

# Install Helper Commands
ADD scripts/bin/* /usr/local/bin/

RUN chmod +x /usr/local/bin/*

RUN apt-install-and-clean curl \
    build-essential \
    git >> /dev/null 2>&1

RUN install-node-12.16.1

RUN mkdir -p /usr/src/app

COPY . /usr/src/app

WORKDIR /usr/src/app

#RUN yarn init-cache
#RUN yarn init-temp
#RUN yarn init-user

RUN yarn install

RUN yarn build

RUN node ./feedsconsumer/consumer.js user_level=0
RUN for i in {1..10}; do node ./feedsconsumer/consumer.js user_level=1; done
RUN for i in {1..20}; do node ./feedsconsumer/consumer.js user_level=2; done
RUN for i in {1..20}; do node ./feedsconsumer/consumer.js user_level=3; done
RUN for i in {1..30}; do node ./feedsconsumer/consumer.js user_level=4; done
RUN for i in {1..40}; do node ./feedsconsumer/consumer.js user_level=5; done

RUN for i in {1..10}; do node ./consumer/consumer.js; done

ENTRYPOINT ["tail", "-f", "/dev/null"]

或者有其他方法吗?

谢谢

【问题讨论】:

    标签: node.js docker apache-kafka


    【解决方案1】:

    一个容器只运行一个进程。你的容器是

    ENTRYPOINT ["tail", "-f", "/dev/null"]
    

    这意味着“绝对不做任何事情,以一种难以覆盖的方式”。我通常建议使用CMD 而不是ENTRYPOINT,并且主容器命令不应该是人为的“除了保持容器运行之外什么都不做”命令。

    在此之前,您尝试RUN 作为主容器进程的进程。 RUN 仅在映像构建阶段发生,正在运行的进程不会保留在映像中,构建将阻塞,直到这些进程完成,并且它们无法连接到其他容器或数据存储。这些是您想成为CMD 的行。

    一个容器只运行一个进程,但您可以在同一个镜像上运行多个容器。通过设置环境变量来添加参数比通过调整命令行更容易(你必须替换整个东西),所以在你的代码中寻找process.env.USER_LEVEL。还要确保进程保持为前台进程,并且不使用包来守护自身。

    那么 Dockerfile 的最后一部分只需要设置一个默认的CMD 来启动您的应用程序的一个副本:

    ...
    COPY package.json yarn.lock .
    RUN yarn install
    COPY . .
    RUN yarn build
    CMD node ./feedsconsumer/consumer.js
    

    现在你可以启动一个运行这个进程的容器

    docker build -t my/consumer .
    docker run -d --name consumer my/consumer
    

    你可以启动多个容器来运行它们的整个集合

    for user_level in `seq 5`; do
      for i in `seq 10`; do
        docker run -d \
          --name "feed-consumer-$user_level-$i" \
          -e "USER_LEVEL=$user_level" \
          my/consumer
      done
    done
    for i in `seq 10`; do
      docker run -d --name "consumer-$i" \
        my/consumer \
        node ./consumer/consumer.js
    done
    

    请注意,最后一次调用会覆盖 CMD 以运行备用脚本;如果它需要覆盖ENTRYPOINT,这将成为一个更加扭曲的调用。 (docker run --entrypoint node my/consumer ./consumer/consumer.js)

    如果您期待 Kubernetes 之类的集群环境,通常可以直接运行多个相同的容器副本,这就是您在这里尝试做的事情。一个 Kubernetes 部署对象有一个 replicas: 计数,您可以 kubectl scale deployment feed-consumer-5 --replicas=40 更改问题中的内容,或者可能配置一个 Horizo​​ntalPodAutoscaler 以根据主题长度动态设置它(最后一个涉及,但可能且有益)。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多