具有环境变量和可覆盖的CMD的ENTRYPOINT

时间:2019-01-22 12:54:07

标签: docker

这允许将$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"]

1 个答案:

答案 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命令。