首页 > 解决方案 > Docker:使用一个 Dockerfile 运行两个服务

问题描述

我正在为高级会员开发电报组,其中我有两项服务,一项是监视所有加入者,另一项是监视是否有任何成员已过期高级计划,因此它将将该用户从频道中踢出。我对 Docker 和部署非常陌生。所以我很困惑,用一个 Dockerfile 同时运行两个进程。我试过这样。

这是文件结构: 在此处输入图像描述

启动.sh

#!/bin/bash
cd  TelegramChannelMonitor

pm2 start services/kickNonPremium.js --name  KICK_NONPREMIUM

pm2 start services/monitorTelegramJoinee.js --name  MONITOR_JOINEE

Dockerfile

FROM node:12-alpine
WORKDIR ./TelegramChannelMonitor
COPY package*.json ./

RUN npm install
COPY . .

EXPOSE 8080
ENTRYPOINT ["/start.sh"]

我应该怎么做才能实现这一目标?

标签: node.jsbashdockerdockerfilemicroservices

解决方案


一个 Docker 容器只运行一个进程。另一方面,您可以从单个映像运行任意多个容器,每个容器使用不同的命令。所以我在这里采用的方法是构建一个图像;正如你所展示的,除了没有这ENTRYPOINT条线。

FROM node:12-alpine
# Note that the Dockerfile already puts us in the right directory
WORKDIR /TelegramChannelMonitor
...
# Important: no ENTRYPOINT
# (There can be a default CMD if you think one path is more likely)

然后,当您要运行此应用程序时,运行两个容器,并在每个容器中让主容器命令运行不同的脚本。

docker build -t telegram-channel-monitor .
docker run -d -p 8080:8080 --name kick-non-premium \
  telegram-channel-monitor \
  node services/kickNonPremium.js
docker run -d -p 8081:8080 --name monitor-joined \
  telegram-channel-monitor \
  node services/monitorTelegramJoinee.js

您可以使用 Docker Compose 进行类似的设置。将所有容器设置为build: .,但command:为每个容器设置不同的值。

(这里要避免的原因ENTRYPOINT是因为覆盖命令的语法变得非常笨拙:你需要--entrypoint node 在图像名称之前,但是它之后的其余参数。我也使用普通node而不是pm2因为 Docker 容器提供了大部分流程主管的功能;另请参阅一起使用 pm2 和 docker 有什么意义?。)


推荐阅读