簡體   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