web-dev-qa-db-fra.com

comment configurer le superviseur pour exécuter un script Shell

Configurer un Dockerfile pour installer les prérequis de noeud puis configurer le superviseur afin d'exécuter la commande finale npm install. Exécution de Docker dans CoreOS sous VirtualBox.

J'ai un Dockerfile qui configure tout correctement:

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"]

Et puis je veux configurer supervisord pour lancer l'un des quelques processus possibles, y compris un script Shell d'installation dont j'ai confirmé le bon fonctionnement, install.sh, Qui se trouve dans l'application /etc De l'application annuaire:

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

Cependant, je suis très nouveau dans la syntaxe du superviseur et je n'arrive pas à lancer correctement le script Shell. Voici ce que j'ai dans mon fichier supervisord.conf:

[supervisord]
nodaemon=true

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

Lorsque j'exécute le Dockerfile, tout fonctionne correctement, mais lorsque je lance l'image, j'obtiens ce qui suit:

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'

De toute évidence, je n'ai pas configuré correctement le superviseur pour exécuter ce script Shell - y a-t-il une partie de la syntaxe que je bousille?

15
fox

La meilleure façon que j'ai trouvée était de régler ceci:

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

pense que j'ai obtenu ce tri: besoin du chemin complet dans command, et au lieu d'avoir user=nonroot dans le .conf fichier, je mets su nonroot dans le install.sh script.

5
fox

J'ai jeté un coup d'œil dans le code source de superviseur et j'ai remarqué que si la commande ne contient pas de barre oblique /, il cherchera dans la variable d'environnement [~ # ~] [~ # ~] pour ce fichier. Cela imite le comportement d'exécution via Shell.

Les méthodes suivantes devraient résoudre votre problème initial:

  1. Spécifiez le chemin complet du script (comme vous l'avez fait dans votre propre réponse)
  2. Préfixez la commande avec ./, c'est à dire. ./install.sh (en théorie, mais non testé)
  3. Préfixez la commande avec l'exécutable Shell, c'est-à-dire /bin/bash install.sh

Je ne comprends pas pourquoi user= ne fonctionne pas pour vous (l'avez-vous essayé après avoir corrigé l'exécution?), mais le problème que vous avez rencontré dans votre propre réponse est probablement dû à l'utilisation incorrecte de su qui ne fonctionne pas comme Sudo . su créera son propre shell interactif et se bloquera donc en attendant l'entrée standard. Pour exécuter des commandes avec su , utilisez le -c drapeau, c'est-à-dire su -c "some-program" nonroot. Un Shell explicite peut également être spécifié avec le -s drapeau si nécessaire.

4
XA21X