-1

我正在尝试在这样的 bash 脚本中运行多个 js 文件。这行不通。容器出现但不运行脚本。但是,当我 ssh 到容器并运行此脚本时,脚本运行良好并且节点服务出现。谁能告诉我我做错了什么?

Dockerfile

FROM node:8.16

MAINTAINER Vivek

WORKDIR /a

ADD . /a
RUN cd /a && npm install

CMD ["./node.sh"]

脚本如下

节点.sh

#!/bin/bash

set -e

node /a/b/c/d.js &

node /a/b/c/e.js &
4

2 回答 2

1

通常,您应该在容器中只运行一个进程。但是,您可以从单个映像运行任意数量的容器,并且很容易设置容器在启动时将运行的命令。

将图像设置为CMD您认为最常见的路径:

CMD ["node", "b/c/d.js"]

如果您为此使用 Docker Compose,则可build: .以为两个容器指定,但在第二个容器中,指定一个备用command:.

version: '3'
services:
  node-d:
    build: .
  node-e:
    build: .
    command: node b/c/e.js

使用 bare docker run,您可以在图像名称后指定备用命令

docker build -t me/node-app .
docker run -d --name node-d me/node-app
docker run -d --name node-e me/node-app \
  node b/c/e.js

这使您可以为每个容器独立设置重启策略等事情;如果您在 Docker Swarm 或 Kubernetes 等集群环境中运行它,您也可以独立扩展这两个容器/pod/进程。

于 2020-05-05T21:37:15.513 回答
1

正如@hmm 提到的,您的脚本可能已运行,但您的容器并未等待您的两个子进程完成。

您可以将您的更改node.sh为:

#!/bin/bash

set -e

node /a/b/c/d.js &
pid1=$!

node /a/b/c/e.js &
pid2=$!

wait pid1
wait pid2

查看https://stackoverflow.com/a/356154/1086545以获得更通用的等待子流程完成的解决方案。

正如@DavidMaze 所提到的,一个容器通常应该运行一个“服务”。当然,您可以决定系统中服务的构成。正如docker官方描述的那样:

通常建议您通过每个容器使用一项服务来分隔关注区域。该服务可能会分叉成多个进程(例如,Apache Web 服务器启动多个工作进程)。拥有多个进程是可以的,但要从 Docker 中获得最大收益,请避免一个容器负责整个应用程序的多个方面。

有关更多详细信息,请参阅https://docs.docker.com/config/containers/multi-service_container/

于 2020-05-05T20:47:03.420 回答