Node.js 如何设置主管以运行shell脚本

Node.js 如何设置主管以运行shell脚本,node.js,bash,docker,supervisord,Node.js,Bash,Docker,Supervisord,设置Dockerfile以安装节点prereq,然后设置supervisor以运行最终的npm install命令。在VirtualBox下运行CoreOS中的Docker 我有一个Dockerfile,可以正确设置所有内容: FROM ubuntu MAINTAINER <<Me>> # Install docker basics RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"

设置
Dockerfile
以安装节点prereq,然后设置supervisor以运行最终的
npm install
命令。在VirtualBox下运行CoreOS中的Docker

我有一个
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"]
但是,我对supervisor语法非常陌生,无法让它正确启动shell脚本。这是我的
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'

很明显,我没有正确设置supervisor来运行这个shell脚本——我有没有弄错语法的一部分?

我想我已经解决了这个问题:需要
命令中的完整路径,而不是
conf
文件中的
user=nonroot
,我将
su nonroot
放入
install.sh
脚本。

我快速查看了源代码,注意到如果命令不包含正斜杠
/
,它将在PATH环境变量中查找该文件。这模仿了通过shell执行的行为

以下方法可以解决您最初的问题:

  • 指定脚本的完整路径(就像您在自己的答案中所做的那样)
  • 在命令前面加上
    /
    ,即
    /install.sh
    (理论上,但未经测试)
  • 在命令前面加上shell可执行文件,即
    /bin/bash install.sh

  • 我不明白为什么
    user=
    对您不起作用(您在修复执行后尝试过吗?),但您在自己的回答中遇到的问题可能是由于错误使用了它,它不像sudo那样起作用。su将创建自己的交互式shell,因此在等待标准输入时将挂起。要使用su运行命令,请使用
    -c
    标志,即
    su-c“some program”非root
    。如有必要,还可以使用
    -s
    标志指定显式shell。

    我发现的最佳方法是设置:

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

    编辑:没有骰子,看起来它挂起了
    信息成功:安装进入运行状态
    ,但没有退出脚本。
    [program:my-program-name]
    command = /path/to/my/command.sh
    startsecs = 0
    autorestart = false
    startretries = 1