wie Sie set supervisor zum ausführen eines shell-Skript
Einrichtung eines Dockerfile
zu Knoten installieren prereqs und dann set-up supervisor in Bezug auf die Ausführung der endgültigen npm install
Befehl. Läuft Docker in CoreOS unter VirtualBox.
Ich habe eine Dockerfile
setzt, alles richtig:
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"]
Und dann will ich einrichten, supervisord zu starten, ein paar möglich Prozesse, einschließlich eines Installations-shell-script, dass habe ich bestätigt, um korrekt zu arbeiten, install.sh
, die sich in der Anwendung /etc
Verzeichnis:
#!/bin/bash
cd /src; npm install
export PATH=$PATH:node_modules/.bin
Allerdings bin ich sehr neu, um-supervisor syntax, und ich kann nicht ankommen es zu starten Sie das shell-Skript korrekt. Dies ist, was ich in meinem supervisord.conf
Datei:
[supervisord]
nodaemon=true
[program:install]
command=install.sh
directory=/src/etc/
user=nonroot
Wenn ich das Dockerfile
läuft alles richtig, aber wenn ich starten das Bild, bekomme ich die folgende:
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'
Klar, habe ich nicht eingerichtet Vorgesetzten richtig zu führen Sie das shell-Skript -- ist es Teil der syntax, ich bin vermasseln?
InformationsquelleAutor fox | 2014-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, die ich gefunden habe, war diese Einstellung:
InformationsquelleAutor epineda
denke ich habe es gelöst: man benötigt den vollständigen Pfad in
command
, und anstattuser=nonroot
im.conf
Datei, lege ichsu nonroot
in dieinstall.sh
Skript.INFO success: install entered RUNNING state
aber nicht beenden das Skript.InformationsquelleAutor fox
Hatte ich einen schnellen Blick in den source-code für supervisor und bemerkt, dass, wenn die Befehl nicht mit einem Schrägstrich
/
wird es Aussehen, in der PFAD Umgebungs-variable für die Datei. Dieser imitiert das Verhalten von der Ausführung über die shell.Den folgenden Methoden beheben sollte Ihre erste problem:
./
, d.h../install.sh
(in der Theorie, aber noch nicht getestet)/bin/bash install.sh
Verstehe ich nicht, warum
user=
funktioniert nicht für Sie (haben Sie versucht, es nach der Reparatur die Ausführung?), aber das problem, denen Sie begegnen, in Ihre eigene Antwort war wohl die falsche Verwendung der su, welches nicht funktioniert, wie sudo. su wird erstellen Sie Ihre eigenen interaktiven shell und wird daher hängen während der Wartezeit für die standard-Eingabe. Befehle ausführen mit su, verwenden Sie die-c
flag, d.h.su -c "some-program" nonroot
. Eine explizite shell kann auch angegeben werden, mit der-s
flag, wenn nötig.InformationsquelleAutor XA21X