这允许$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 到达入口点。它appears在两个单独的命令中运行它。 IE: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"]
注意:这不起作用
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 用户中会看到)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)