设置Dockerfile
以安装节点先决条件,然后设置超级用户以运行最终的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'
显然,我还没有正确设置supervisor来运行这个shell脚本 - 是否有部分语法我搞砸了?
答案 0 :(得分:11)
我找到的最佳方法是设置:
[program:my-program-name]
command = /path/to/my/command.sh
startsecs = 0
autorestart = false
startretries = 1
答案 1 :(得分:5)
我认为我对此进行了排序:需要command
中的完整路径,而不是user=nonroot
文件中的.conf
,我将su nonroot
放入install.sh
脚本。
答案 2 :(得分:4)
我快速查看了supervisor的源代码,并注意到如果命令不包含正斜杠/
,它会查看 PATH 该文件的环境变量。这模仿了通过shell执行的行为。
以下方法应该可以解决您的初始问题:
./
前缀命令,即./install.sh
(理论上,但未经测试)/bin/bash install.sh
我不明白为什么user=
对你不起作用(你在修复执行后尝试过吗?),但你在自己的答案中遇到的问题可能是由于{{3}的错误使用}它不像 sudo 那样工作。 su 将创建自己的交互式shell,因此在等待标准输入时会挂起。要使用 su 运行命令,请使用-c
标记,即su -c "some-program" nonroot
。如有必要,还可以使用-s
标志指定显式shell。