繁体   English   中英

如何在 docker 中为 kafka 运行 feedconsumers 和 consumer?

[英]how to run feedconsumers and consumers multiple for kafka in docker?

所以我有这个 docker 文件,我想多次运行 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"]

或者有没有其他办法?

谢谢

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

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

这转化为“绝对不做任何事情,以一种难以超越的方式”。 我通常建议在ENTRYPOINT CMD并且主容器命令不应该是人为的“除了保持容器运行之外什么都不做”命令。

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

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

然后 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 部署 object 有一个replicas:计数,您可以kubectl scale deployment feed-consumer-5 --replicas=40来更改问题中的内容,或者可能配置一个 HorizontalPodAutoscaler 以根据主题长度动态设置它(最后一个参与,但可能且有益)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM