[英]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.