我试图从docker run命令向supervisor传递一个varibale,这样它就可以执行一个带有变量值的脚本。我们需要在运行时设置它,以便每个开发人员都可以在rabbitmq中拥有自己的队列,这样我们就不会在测试期间破坏彼此的队列。
Docker运行命令:
docker run -i -p 5672:5672 -p 9200:9200 -p 9300:9300 -p 9001:9001 -p 15672:15672 -e "PARENT_HOSTNAME=MACHINED58" --rm --name shovel -t dtwill/blkmesa:shovel
docker CMD声明(在查看文档之后,我知道错误发生的原因不能提供一个arbritrary parm http://supervisord.org/running.html):
CMD /usr/bin/supervisord
主管配置:
[program:update_rabbit_config]
command=/src/update_rabbit_config.sh
redirect_stderr=true
priority=200
startsecs=3
脚本主管运行:
machineName=$PARENT_HOSTNAME
echo machine name = $machineName
sed -i .bak "s/|machine|/'$machineName'/" /etc/rabbitmq/rabbitmq.config
这是错误:
INFO exited: update_rabbit_config (exit status 1; not expected)
...所以,如果有人知道如何实现这一目标,我会非常感激,并会在我开悟的时候开心跳舞。
谢谢!
[更新]我更新了相关部分以使用答案中的建议。另外,当我手动运行脚本时(包括使用nsenter连接到正在运行的容器后),我还包括脚本的结果:
root@1e2aeaa3dfb8:/src# bash update_rabbit_config.sh
machine name =
sed: -e expression #1, char 1: unknown command: `.'
环境变量看起来不在上下文中。
答案 0 :(得分:3)
我不是主管的专家,但在documentation,据说:
请注意,子进程将继承用于启动“supervisord”的shell的环境变量,除了在此处重写的那些(
environment
)。请参阅Subprocess Environment。
根据我的理解,您应该从主管配置中删除environment=PARENT_HOSTNAME=%(PARENT_HOSTNAME)s
。
您的sed
命令也存在问题。因为您使用单引号'
变量替换不会发生。请尝试改为:
echo machine name = $PARENT_HOSTNAME
sed -i .bak "s/|machine|/$PARENT_HOSTNAME/" /etc/rabbitmq/rabbitmq.config