这允许将$ENV_VAR
传递给foo
ENTRYPOINT /usr/bin/foo $ENV_VAR
这不会,因为传递了文字字符串“ $ ENV_VAR”,而不是环境变量的内容。
ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"]
这允许覆盖CMD
ENTRYPOINT ["/usr/bin/foo"]
CMD ["--some-flag"]
这不允许CMD到达入口点。它会出现以两个单独的命令运行。即:sh /usr/bin/foo && sh --some-flag
ENTRYPOINT /usr/bin/foo
CMD --some-flag
如何制作一个使用环境变量并具有可覆盖CMD的ENTRYPOINT?理想的形式如下
注意:这不起作用
ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"]
CMD ["--some-flag"]
答案 0 :(得分:3)
注意:这不起作用
ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"] CMD ["--some-flag"]
这将以$ENV_VAR
作为第一个参数,--some-flag
作为第二个参数运行foo。您需要将$ENV_VAR
转换为环境变量值,而这是由Shell完成的。 ENTRYPOINT / CMD的json语法明确禁用了该外壳程序,因此扩展该值取决于您的可执行文件。
如果您尝试通过以下方式将ENTRYPOINT更改为shell语法:
ENTRYPOINT /usr/bin/foo "$ENV_VAR"
CMD ["--some-flag"]
您会发现docker将其转换为正在运行:
/bin/sh -c "/usr/bin/foo \"$ENV_VAR\"" "--some-flag"
如果您查看关于-c
选项的文档,您会发现这仅需要一个arg。因此,此选项不适用于正在引号外传递的--some-flag
选项。
最简单的解决方案是将其移至Shell脚本:
#!/bin/sh
exec /usr/bin/foo "$ENV_VAR" "$@"
将其作为entrypoint.sh复制到您的容器中
COPY entrypoint.sh /
RUN chmod 755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["--some-flag"]
请注意,只有在无法使脚本在所有构建主机/代码存储库上都可执行(有时与Windows用户一起使用)时,才需要chmod命令。