Запуск bash скрипта в dockerfile - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь запустить несколько файлов js в сценарии bash, подобном этому. Это не работает. Контейнер появляется, но не запускает скрипт. Однако когда я отправляю sh в контейнер и запускаю этот скрипт, скрипт работает нормально, и появляется служба узла. Может ли кто-нибудь сказать мне, что я делаю не так?

Dockerfile

FROM node:8.16

MAINTAINER Vivek

WORKDIR /a

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

CMD ["./node.sh"]

Скрипт, как показано ниже

node. sh

#!/bin/bash

set -e

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

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

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Обычно вы должны запускать только один процесс в контейнере. Однако вы можете запускать любое количество контейнеров из одного образа, и легко установить команду, которую контейнер будет запускать при запуске.

Установите 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, вы также можете независимо масштабировать два контейнера / модуля / процесса.

1 голос
/ 05 мая 2020

Как упоминает @hmm, ваш скрипт может быть запущен, но ваш контейнер не ждет, пока ваши два подпроцесса завершатся sh.

Вы можете изменить свой node.sh на:

#!/bin/bash

set -e

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

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

wait pid1
wait pid2

Checkout { ссылка } для более общего решения ожидания подпроцессов до fini sh.

Как упоминает @DavidMaze, контейнер обычно должен запускать один "служба". Конечно, вам решать, что представляет собой сервис в вашей системе. Согласно официальному описанию docker:

Обычно рекомендуется разделять проблемные области, используя одну службу для каждого контейнера. Эта служба может разделяться на несколько процессов (например, веб-сервер Apache запускает несколько рабочих процессов). Можно иметь несколько процессов, но чтобы получить максимальную пользу от Docker, избегайте того, чтобы один контейнер отвечал за несколько аспектов вашего приложения в целом.

См. https://docs.docker.com/config/containers/multi-service_container/ подробнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...