как настроить супервизор для запуска сценария оболочки

Настройка Dockerfile для установки предварительных требований узла, а затем настройка супервизора для запуска последней команды npm install. Запуск Docker в CoreOS под VirtualBox.

У меня есть Dockerfile, который все правильно настраивает:

FROM ubuntu
MAINTAINER <<Me>>

# Install docker basics
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get upgrade -y

# Install dependencies and nodejs
RUN apt-get update
RUN apt-get install -y python-software-properties python g++ make
RUN add-apt-repository ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get install -y nodejs

# Install git
RUN apt-get install -y git

# Install supervisor
RUN apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor

# Add supervisor config file
ADD ./etc/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# Bundle app source
ADD . /src

# create supervisord user
RUN /usr/sbin/useradd --create-home --home-dir /usr/local/nonroot --shell /bin/bash nonroot
RUN chown -R nonroot: /src

# set install script to executable
RUN /bin/chmod +x /src/etc/install.sh

#set up .env file
RUN echo "NODE_ENV=development\nPORT=5000\nRIAK_SERVERS={SERVER}" > /src/.env

#expose the correct port
EXPOSE 5000

# start supervisord when container launches
CMD ["/usr/bin/supervisord"]

Затем я хочу настроить supervisord для запуска одного из нескольких возможных процессов, в том числе установочного сценария оболочки, который, как я подтвердил, работает правильно, install.sh, который находится в каталоге приложения /etc:

#!/bin/bash
cd /src; npm install
export PATH=$PATH:node_modules/.bin

Однако я очень плохо знаком с синтаксисом супервизора и не могу заставить его правильно запускать сценарий оболочки. Вот что у меня есть в моем файле supervisord.conf:

[supervisord]
nodaemon=true

[program:install]
command=install.sh
directory=/src/etc/
user=nonroot

Когда я запускаю Dockerfile, все работает правильно, но когда я запускаю образ, я получаю следующее:

2014-03-15 07:39:56,854 CRIT Supervisor running as root (no user in config file)
2014-03-15 07:39:56,856 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
2014-03-15 07:39:56,913 INFO RPC interface 'supervisor' initialized
2014-03-15 07:39:56,913 WARN cElementTree not installed, using slower XML parser for XML-RPC
2014-03-15 07:39:56,914 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2014-03-15 07:39:56,915 INFO supervisord started with pid 1
2014-03-15 07:39:57,918 INFO spawnerr: can't find command 'install.sh'
2014-03-15 07:39:58,920 INFO spawnerr: can't find command 'install.sh'

Ясно, что я неправильно настроил супервизора для запуска этого сценария оболочки — есть ли часть синтаксиса, которую я напортачил?


person fox    schedule 15.03.2014    source источник


Ответы (3)


Лучший способ, который я нашел, это установить это:

[program:my-program-name]
command = /path/to/my/command.sh
startsecs = 0
autorestart = false
startretries = 1
person epineda    schedule 22.08.2016

думаю, я разобрался: нужен был полный путь в command, и вместо user=nonroot в файле .conf я поместил su nonroot в скрипт install.sh.

person fox    schedule 15.03.2014
comment
редактировать: нет кубиков, похоже, что он висит на INFO success: install entered RUNNING state, но не выходит из скрипта. - person fox; 15.03.2014

Я быстро просмотрел исходный код для supervisor. и заметил, что если команда не содержит косую черту /, она будет искать этот файл в переменной окружения PATH. Это имитирует поведение выполнения через оболочку.

Следующие методы должны решить вашу первоначальную проблему:

  1. Укажите полный путь к скрипту (как вы сделали в своем собственном ответе)
  2. Добавьте к команде префикс ./, то есть ./install.sh (теоретически, но не проверено).
  3. Добавьте префикс команды к исполняемому файлу оболочки, например /bin/bash install.sh.

Я не понимаю, почему у вас не работает user= (вы пробовали это после исправления выполнения?), но проблема, с которой вы столкнулись в своем собственном ответе, вероятно, была связана с неправильным использованием su, который не работает как sudo. su создаст собственную интерактивную оболочку и поэтому зависнет в ожидании стандартного ввода. Чтобы запускать команды с помощью su, используйте флаг -c, то есть su -c "some-program" nonroot. Явная оболочка также может быть указана с флагом -s, если это необходимо.

person XA21X    schedule 06.09.2014