如何从docker run命令向管理程序传递环境变量

时间:2014-11-04 20:53:27

标签: rabbitmq docker supervisor

我试图从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: `.'

环境变量看起来不在上下文中。

1 个答案:

答案 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