这允许 $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"]
最佳答案
note: this does not work
ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"] CMD ["--some-flag"]
这将运行 foo,并以 $ENV_VAR
作为第一个参数,以 --some-flag
作为第二个参数。您想要的是将 $ENV_VAR
转换为环境变量值,这是由 shell 完成的。 ENTRYPOINT/CMD 的 json 语法显式禁用 shell,因此由您的可执行文件扩展该值。
如果您尝试将 ENTRYPOINT 更改为 shell 语法:
ENTRYPOINT /usr/bin/foo "$ENV_VAR"
CMD ["--some-flag"]
你会发现 docker 将其转换为运行:
/bin/sh -c "/usr/bin/foo \"$ENV_VAR\"" "--some-flag"
如果您查看有关 -c
选项的文档,您会发现这只需要一个参数。因此,此选项不适用于在引号之外传递的 --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"]
请注意,仅当您无法使脚本在所有构建主机/代码存储库上可执行时才需要 chmod 命令(有时在 Windows 用户中会出现)。
关于docker - 具有环境变量和可重写 CMD 的 ENTRYPOINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308754/