我可以将* reference *传递给docker CMD中的环境变量吗?

时间:2020-10-22 03:38:42

标签: docker shell amazon-ecs

我通过ECS任务运行Docker容器,并尝试覆盖“任务定义”中的Docker CMD。我无法控制Docker容器,但默认情况下,其入口点为“ /share/script.sh”。

此入口点脚本最终使用从$ @传入的参数调用Chef Inspec(符合性检查应用程序),如下所示:

inspec exec linux-baseline $@

当我通过覆盖CMD传递纯文本参数时,一切都很好。例如,传入

CMD ["--backend","ssh"]

将导致

inspec exec linux-baseline --backend ssh

正在执行。

我想做的是通过CMD传递对容器环境变量的引用(假设我们知道已定义$ STACK = stack-name)-类似于:

CMD ["--stack","${STACK}"]

执行代码所在的位置

inspec exec linux-baseline --stack stack-name

有什么办法吗?

1 个答案:

答案 0 :(得分:1)

最好的方法可能是将此选项移到启动脚本中。您只能使用CMD语法来做到这一点。

如果您愿意退出容器命令模式,则可以通过不使用ENTRYPOINT并使用字符串形式CMD来实现:

# Reset ENTRYPOINT to empty
ENTRYPOINT []
CMD /share/script.sh --stack "${STACK}"

这还意味着,如果您在CMD调用或撰写docker run中覆盖command:,则需要包括脚本名称。

类似的选项是编写您自己的包装脚本,使其成为可能填充更多选项的新入口点:

#!/bin/sh
exec /share/script.sh --stack "${STACK}" "$@"
ENTRYPOINT ["/new-entrypoint.sh"]

Docker从来没有在本地进行环境变量扩展。相反,CMD指令具有两种形式:

  1. 如果您使用JSON数组CMD ["--stack", "${STACK}"],则不会进行插值或其他处理。命令部分正是两个词--stack {STACK}
  2. 如果您使用其他任何工具,Docker都会注入一个shell来运行命令,并且该shell可以进行环境变量扩展;命令部分就是三个单词sh-c和命令字符串,它们是一个单词(引号,标点,大括号和所有)。

在您的情况下,您不能使用任何一种形式:第一种形式不执行变量扩展,第二种形式包括脚本无法理解的单词sh-c