node.js - 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"]
我应该怎么做才能实现这一目标?
解决方案
一个 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 有什么意义?。)
推荐阅读
- html - 我的图像未显示,而是显示了替代图像
- sql-server - 查询的多维数据集只返回一个值:度量的总值
- react-native - Stripe Connect 帐户 - return_url - 链接回 Expo 应用程序
- javascript - 使用 AppleScript 打开 Photoshop 文件中的所有智能对象
- python - 将房间移动到房间的程序
- c++ - 无法加载源“./csu/../csu/libc-start.c”:
- visual-studio-code - 来自 D 盘的 Visual Studio Code 中的 Git-Bash
- c - C 中网络服务器的非 ASCII 字符
- javascript - 我想显示从这个天气 API(https://openweathermap.org/current)获取的结果,但是当我输入城市名称时,我没有得到任何响应
- angular - 为什么我的图形不显示?页面是白色的