繁体   English   中英

在 dockerfile 中运行 bash 脚本

[英]Running bash script in a dockerfile

我正在尝试在这样的 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 &

正如@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/

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

将图像的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

使用裸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/进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM