comment configurer le superviseur pour exécuter un script shell
La configuration d'un Dockerfile
pour installer nœud prereqs et ensuite mis en place superviseur afin de courir la dernière npm install
de commande. L'exécution de Docker dans CoreOS sous VirtualBox.
J'ai un Dockerfile
qui met tout en place 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 mettre en place supervisord pour le lancement de l'un de quelques processus possibles, y compris une installation de script shell que j'ai confirmé pour fonctionner correctement, install.sh
qui est situé dans l'application de la /etc
répertoire:
#!/bin/bash
cd /src; npm install
export PATH=$PATH:node_modules/.bin
Cependant, je suis très nouveau pour superviseur de la syntaxe, et je n'arrive pas à lancer le script shell correctement. C'est ce que j'ai dans mon supervisord.conf
fichier:
[supervisord]
nodaemon=true
[program:install]
command=install.sh
directory=/src/etc/
user=nonroot
Quand je lance le Dockerfile
tout fonctionne correctement, mais lorsque je lance l'image, j'obtiens le suivant:
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'
Clairement, je n'ai pas mis superviseur correctement pour exécuter ce script shell -- est là une partie de la syntaxe que je suis vissage?
source d'informationauteur fox
Vous devez vous connecter pour publier un commentaire.
La meilleure façon que j'ai trouvé était la définition de cette:
pense que j'ai eu cette triés: le chemin d'accès complet dans
command
et au lieu d'avoiruser=nonroot
dans le.conf
fichier, j'ai missu nonroot
dans leinstall.sh
script.J'ai eu un rapide coup d'oeil dans le code source pour superviseur et a remarqué que si la commande ne contient pas de barre oblique
/
il se regarde dans le CHEMIN variable d'environnement pour ce fichier. Cela imite le comportement d'exécution via le shell.Méthodes suivantes devrait résoudre votre problème initial:
./
c'est à dire./install.sh
(en théorie, mais non testé)/bin/bash install.sh
Je ne comprends pas pourquoi
user=
ne fonctionne pas pour vous (avez-vous essayé après la fixation de l'exécution?), mais le problème que vous rencontrez dans votre propre réponse était probablement due à l'utilisation incorrecte de su qui ne fonctionne pas comme sudo. su va créer son propre shell interactif et va donc se bloquer lors de l'attente de l'entrée standard. Pour exécuter des commandes avec suutilisez le-c
drapeau, c'est à diresu -c "some-program" nonroot
. Explicite shell peut également être spécifié avec le-s
drapeau si nécessaire.