如何设置pipe理员运行一个shell脚本

设置一个Dockerfile来安装节点prereqs,然后设置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"] 

然后我想设置supervisord来启动几个可能的进程之一,包括我已经确认可以正常工作的安装shell脚本install.sh ,它位于应用程序的/etc目录中:

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

不过,我对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' 

显然,我没有正确设置主pipe来运行这个shell脚本 – 是否有一些我搞砸了的语法?

我发现的最好的方法是设置这个:

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

认为我得到了这种sorting:需要在command的完整path,而不是在.conf文件中有user=nonroot ,我把su nonroot放入install.sh脚本。

我简要介绍了supervisor的源代码,并注意到如果该命令不包含正斜杠/ ,它将在PATH环境variables中查找该文件。 这模仿了通过shell执行的行为。

以下方法应该解决你最初的问题:

  1. 指定脚本的完整path(就像你在自己的答案中所做的那样)
  2. ./加上命令 ,即./install.sh (理论上是未经testing的)
  3. 用shell可执行文件前缀命令 ,即/bin/bash install.sh

我不明白为什么user=不适合你(你是否尝试过修复执行?),但是你在自己的答案中遇到的问题可能是由于不正确的使用su ,它不像sudo一样工作。 su会创build自己的交互式shell,因此会在等待标准input时挂起。 要用su运行命令,请使用-c标志,即su -c "some-program" nonroot 。 如果需要,还可以使用-s标志指定显式shell。