我通过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
有什么办法吗?
答案 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
指令具有两种形式:
CMD ["--stack", "${STACK}"]
,则不会进行插值或其他处理。命令部分正是两个词--stack
{STACK}
。sh
,-c
和命令字符串,它们是一个单词(引号,标点,大括号和所有)。在您的情况下,您不能使用任何一种形式:第一种形式不执行变量扩展,第二种形式包括脚本无法理解的单词sh
和-c
。