![](/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.