![](/img/trans.png)
[英]How to use multiple consumers in different programming language for same group ID in Kafka
[英]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.