如何从docker run命令中向supervisor传递一个环境变量

3
我正在尝试通过docker run命令将一个变量传递给supervisor,以便它可以使用该变量值执行脚本。我们需要在运行时设置这个变量,以便每个开发者都可以在rabbitmq中拥有自己的队列,这样我们就不会在测试期间互相干扰了。
docker run命令:
  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 语句(经过查看文档,我知道为什么会出错,无法提供任意参数: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个回答

3

我不是监管专家,但在文档中提到:

请注意,子进程将继承用于启动“supervisord”的shell的环境变量,除了这里覆盖的变量(environment)。请参阅子进程环境

据我理解,您应该从监管配置中删除environment=PARENT_HOSTNAME=%(PARENT_HOSTNAME)s


您的sed命令也存在问题。由于您使用了单引号',变量替换不会发生。请尝试改用:

echo machine name = $PARENT_HOSTNAME
sed -i .bak "s/|machine|/$PARENT_HOSTNAME/" /etc/rabbitmq/rabbitmq.config

是的,docker run 中的 -e 用于设置环境变量。直接使用它们即可。 - user2105103
谢谢@Thomasleveil。我尝试了那个,但当子进程运行时仍然出现错误。 - Will Lopez
你已经从 CMD /usr/bin/supervisord $PARENT_HOSTNAME 中移除了 $PARENT_HOSTNAME 吗?你需要这样做,因为 PARENT_HOSTNAME 将从环境变量中读取,而不是从 supervisord 参数中读取。 - Thomasleveil
+Thomasleveil 是的先生。它看起来像上面的代码。我已经从Docker文件和supervisor配置中将其删除了。 - Will Lopez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接