我只是注意到,类似helm install --set tag=20161216
最终在模板中以科学计数法表示,这是因为{{ typeOf .Value.tag }}
产生了float64
。
甚至对于helm install --set tag=1
-> float64
这样的小整数也是如此。
这是在头盔2.1.0中发生的
如果您执行--set tag=\"1\"
它的工作方式是否有所不同?
感谢@chancez,我们知道了确切的问题:在ghodss/yaml
进行的JSON转换中,将整数强制转换为float64s以表示Javascript的数字类型。 这导致超过一定值的所有整数都用科学计数法表示。
我被同样的问题咬了。 克服驼峰(或错误)的方法是执行以下操作:
--set bignumber=\\"a185576882739235744\\"
我们使用的另一种解决方法是执行以下操作:
--set port=":1234567"
然后在模板中:
{{ .Values.port | replace ":" "" }}
! 😷
这真是太痛苦了,
我还不太愿意吞下自己的骄傲并尝试@technosophos的丑陋
现在,我通过扩展部署脚本来解决此问题,方法是将yaml数据写入临时文件,然后将其用作-f
参数。
对于图片标签,我有时会遇到相同的问题。
我将尝试使用这些解决方法之一。 我希望它会尽快修复:)
就我而言,在下面的--set image.tag=5997578
上看到它:
$ kubetctl describe po msj-treasure-map-msj-treasure-map-192172122-dnb80
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 1m default-scheduler Successfully assigned msj-treasure-map-msj-treasure-map-192172122-dnb80 to ip-10-253-13-113.ec2.internal
Warning InspectFailed 15s (x9 over 1m) kubelet, ip-10-253-13-113.ec2.internal Failed to apply default image tag "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06": couldn't parse image reference "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06": invalid reference format
Warning InspectFailed 15s (x9 over 1m) kubelet, ip-10-253-13-113.ec2.internal Failed to apply default image tag "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06": couldn't parse image reference "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06": invalid reference format
Warning FailedSync 15s (x9 over 1m) kubelet, ip-10-253-13-113.ec2.internal Error syncing pod, skipping: [failed to "StartContainer" for "msj-treasure-map-uwsgi" with InvalidImageName: "Failed to apply default image tag \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06\": couldn't parse image reference \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06\": invalid reference format"
, failed to "StartContainer" for "msj-treasure-map-nginx" with InvalidImageName: "Failed to apply default image tag \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06\": couldn't parse image reference \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06\": invalid reference format"
$ helm version
Client: &version.Version{SemVer:"v2.5.1", GitCommit:"7cf31e8d9a026287041bae077b09165be247ae66", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.5.1", GitCommit:"7cf31e8d9a026287041bae077b09165be247ae66", GitTreeState:"clean"}
我在头盔2.6.2上也遇到了同样的问题。
Client: &version.Version{SemVer:"v2.6.2", GitCommit:"be3ae4ea91b2960be98c07e8f73754e67e87963c", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.6.2", GitCommit:"be3ae4ea91b2960be98c07e8f73754e67e87963c", GitTreeState:"clean"}
今天在努力解决此问题时,我发现toString
过滤器可以帮助解决此问题:
dockerPort: {{ .Values.dockerPort | toString }}
然后,我能够在命令行中传递端口( --set dockerPort=2376
)并正确解释它。
我们只是在2.7.2上看到了这一点,除了将所有--set
选项写入本地文件并通过helm -f locals.yml
传递之外,大多数变通办法对我们来说都不起作用。
我也在2.7.2中看到了这一点(并因此提交了#3246),因此在此问题上为+1。 就像在https://github.com/kubernetes/helm/issues/3001中一样,我也将git SHAs用于我的docker图像标签。 我现在的解决方法FWIW是在图像标签后缀-gitsha
也为我+1。
$ helm version ⏎
Client: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}
$ git rev-parse --short HEAD
6180689
$ helm upgrade foobar \
-i charts/foobar \
--set image.tag=$(git rev-parse --short HEAD) \
--reuse-values
部署后,我得到以下信息:
Failed to apply default image tag "gcr.io/foobar/foobar:6.180689e+06": couldn't parse image reference "gcr.io/foobar/foobar:6.180689e+06": invalid reference format
Error syncing pod
运行kubectl get pods
也会得到InvalidImageName
kubectl get pods
。
追加| toString
似乎对我没有影响。
你能做:
{{ .Values.tag | int64 }}
绝对在图表中使用@laverite ,但这使用的是--set解析器。 仅对于--set解析器存在此问题。 正确解析了通过values.yaml传递的值。 :)
看来这与#3155有关
是的,请相信@jesselang
头盔2.8.0在这里也有同样的问题。
@bacongobbler或@technosophos我在#3599上已解决此问题,已经有了一个批准,只需要另一个即可。 谢谢!
通过#3599解决
感谢ping @ arturo-c :)
在Helm 2.9.1中也看到此错误
我不知道为什么helm lint
不能抓住这个? 参见#4099
我很好奇为什么通过添加--set-string
而不是解决在我看来是--set
的明显错误的问题来解决此问题。
是否有任何人打算将数字强制转换为Yaml文件中的科学计数法?
两个字:向后兼容:)
我们可以更改--set
解析器在Helm 3中--set
类的核心功能的预期行为,因为有太多用户在运行Helm在生产中。 我们也不能将--set
所有值都强制转换为字符串,因为这会破坏现有行为,例如围绕value文件中null和true值的预期行为,因此--set-string
被认为是可行的暂时解决。
向后兼容吗? 仅仅是普通的“ WTF”功能,可能没有多少人想要或使用它吗? 使用的工具尚处于开发阶段,并未得到广泛采用? 我建议重新考虑一下,并在真正迟到之前修复它。
@technosophos谢谢。
例子:
kind: Secret
data:
some_db_port: {{ .Values.dbInfo.db_port | replace ":" "" | b64enc }}
这对我来说是工作。
@OndraZizka感谢您(非常热情)的反馈。 我们肯定正在研究解决--set
解析器为Helm 3带来的一些奇怪的行为问题,可能是通过将其替换为类似于新的--set-string
解析器的方式来解决的。
我完全同意--set
的行为在这种情况下非常奇怪(甚至是完全错误的),但是我们不能指望用另一个替换整个解析库,并且相信不会有其他强制性新系统中的错误。 交换强制库将被视为向后不兼容的更改。
目前, --set-string
是一个很棒的功能,我强烈建议其他遇到此错误的人使用它,以在不依赖类型强制的情况下尽可能多地使用--set-string
。 这样,值将被强制为字符串而不是浮点数。
不幸的是,当Ansible将dict格式化为yaml(这是我的values.yaml)时,它不会添加任何引号,这对我来说是个大问题。 我不敢相信我必须使用这种血腥的骇客: replace ":" ""
如果您需要一种解决方法而无需在标签前加上:
前缀并在以后将其删除,则可以使用该标签(tl; dr:当标签是数字时,请使用printf进行打印,否则请打印你得到的字符串)
{{- $tag := .Values.image.tag }}
{{- $type := printf "%T" $tag }}
image: "{{ .Values.image.repository }}:{{if eq $type "float64"}}{{ printf "%.0f" $tag }}{{ else }}{{ $tag }}{{ end }}"
该错误也发生在helm ... -f myval.yaml
仅供参考,此问题已在https://github.com/helm/helm/pull/6010中修复
@bacongobbler仍然发生在我身上有舵版本v2.14.3
你能打开一个新的问题吗? 谢谢。
由于需要还原#6749中的#6010而重新打开。
该修复程序何时可用?
参见#6888。
@sagarkal ,以确保我们在同一页面上:前述修复仅旨在达到Helm v3,而不是v2(我声明是随机贡献者,实际决定始终由团队决定)。 所做的更改相对较大,并且不应该被认为100%安全地合并到2.x分支中,该分支现在仅是补丁程序。 同时,如果有机会,可以针对用例测试PR分支,并让我们知道事情是否按预期进行,那就太好了。 那会很有帮助!
使用--set-string image.tag=6599236
为我使用像这样的简单模板
...
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
env:
...
使用在图表的值文件中指定的大整数值来运行此操作。 它被隐式转换为具有科学计数法的浮点数。 只需将值强制转换为int
解决此问题,并且比我所见过的其他一些解决方法更干净:
# values.yaml
tomcat:
maxPostSize: 2097152
# Cast to int when used
{{ .Values.tomcat.maxPostSize | int }}
这已在Helm v3.1.1中进行了测试。
很高兴知道! 与我见过的许多方法相比,这绝对是一个简单的解决方法。 谢谢!
@Rathgore在所有时间都与int进行处理时,将其--set-string
选项传递值。
@ m0rganic我还没有测试过,但是您可以尝试使用toString
代替int
或使用!!str
显式设置类型。 如果您仅使用--set-string
,则不需要此操作,但对于图表中定义的值,我们也需要此行为。
@ m0rganic我还没有测试过,但是您可以尝试使用
toString
代替int
或使用!!str
显式设置类型。 如果您仅使用--set-string
,则不需要此操作,但对于图表中定义的值,我们也需要此行为。
toString
不起作用,在某些情况下,我无法使用!!str
。
是否有解决此问题的计划? 这个问题已经开放了很长时间...
参见#6888。 否则,不会。 我们已经记录了许多要使用的模式。 但是我们还没有找到能够解决更多问题的解决方案。 随意尝试PR。
感谢您及时的回复! 我不确定任何建议的解决方法都可以解决我的用例,但我会再试一次。
如果您执行
--set tag=\"1\"
它的工作方式是否有所不同?
在我的情况下,我在int,float和bool值中使用了""
,它可以正常工作,谢谢
对于头盔2,您可以在()之间将其投射为所需的任何内容,如下例所示
{{- range $i := until (int .Values.deployment.numberofracks) }}
- name: rack{{$i}}
{{- end}}
我将假设此问题已在Helm 3中修复,因为自上次发布以来已经过去了3个星期,此问题似乎已修复。 如果还有其他人在Helm 3中遇到此问题,请随时进行讨论,我们可以重新打开此问题。 谢谢!
这仍然是一个问题。 我在3.3.0
并且仍然遇到这种情况。
你能提供一个示范吗?
很高兴,但是我不确定如何做到这一点; 我有一个图表,其values.yaml
的字段看起来像这样:
customEnv:
SOME_ENV_VAR: 10000000
然后在templates/deployment.yaml
,我有这个:
...
containers:
- name: someContainer
env:
{{- range $key, $value := .Values.customEnv }}
- name: {{ $key | quote }}
value: {{ $value | quote }}
{{- end }}
...
当我运行helm template
,我在渲染的输出中得到了这个值:
...
containers:
- name: someContainer
env:
- name: "SOME_ENV"
value: "1e+07"
...
然后我部署的应用程序尝试将SOME_ENV
的值解析为数字时失败。
好的。 按照您对Helm 3.3.1的指示,我设法重现了同样的问题。 谢谢你。 重新开放。
我在相同的问题上打了一个稍微不同的角度。 我的appVersion
是8482e77
,如果我在任何地方引用appVersion
表示为+Inf
。 调试BTW很有趣。
编辑:
将appVersion从appVersion: 8482e77
更改appVersion: "8482e77"
解决了我的问题
这是意料之中的。 YAML不用报价就将其值解析为科学计数法(因为8482e77
表示“ 8482 * 10 ^ 77”)。 如果要将值视为字符串,请将其用引号引起来。
我有contianer图像标签这个问题。 解决了以下创建帮助器的问题:
+{{/* Generate Image Name */}}
+{{- define "helpers.image" }}
+{{- $tag := printf "%f" .Values.app.image.tag -}}
+{{- if regexMatch "^[0-9]+\\.[0-9]+$" $tag }}
+{{ .Values.image.repository }}:{{ .Values.image.tag | int }}
+{{- else }}
+{{ .Values.image.repository }}:{{ .Values.image.tag }}
+{{- end }}
+{{- end }}
然后,在“部署清单”中:
containers:
- name: {{ template "helpers.fullname" . }}
image: {{ template "helpers.image" . }}
这个问题解决了吗? 如果没有,那么我想解决这个问题。
否。请参见上面。 请确保阅读该线程并自己进行测试。 :)
由于此问题已经开放90天,没有任何活动,因此已被标记为过时。 如果没有进一步的活动,此线程将在30天内自动关闭。
颠簸,仍然是一个问题
当我在可能是数字的提交ID上遇到此问题时,我正在使用此解决方法:
{{- define "numericSafe" -}}
{{- if . | toString | contains "e+" -}}
{{ . | toString | replace "." "" | regexFind "^\\d+" }}
{{- else -}}
{{ . }}
{{- end -}}
{{- end -}}
然后与
{{ include "numericSafe" .Values.git.commitID }}
如果您的原始字符串从不包含点号和e+
,则可以解决问题,尽管我不知道它是否是一个很长的数字字符串,否则将省略任何内容。
@urakagi不幸的是,如果您的值是: 1800000
,这将不起作用
是否计划解决此问题?
任何更新?
@bacongobbler从@edobry的摄制实际上是一个不同的问题。 这最初是关于通过--set
传递值的,该值现已修复,并添加了--set-string
选项。
该repro大约是values.yaml内部的一个数字被更改为科学计数法。 如果应该将repro视为字符串,则可以通过引用values.yaml
的数字来修复。 如果将其用作数字,则表示法不成问题。
我查看了代码,我想我可以将其行为更改为以标准符号输出数字,而不是最多20个十进制数字。 之后,基本的yaml解析器中似乎存在一些实现限制,该解析器将非常大的数字四舍五入和/或将其转换为科学计数法。
我还试图找到另一个问题来处理@edobry的repro中描述的问题,并且我发现#9162的分辨率似乎是因为解析器按其认为合适的方式解析值。 yaml规范的范围。
因此,当有人使用例如没有任何数值(没有在其上定义算术)的数值标签时,应在values.yaml
中将它们引用为字符串,这应该可以解决此问题:
# values.yaml
foo: "10000000"
# template
foo: {{ .Values.foo | quote }}
md5-aba98a385ca8fe457cb1f98967ed3bf1
# Source: foo/templates/x.yaml
foo: "10000000"
md5-265ed31678f08bdbd76c259b974f5398
# Source: foo/templates/x.yaml
foo: "1e+07"
md5-3df6a1bc5fe8f474ded5c2033aaf11a3
# Source: foo/templates/x.yaml
foo: "10000000"
因此,如果有人认为解析无引号的数字应该遵循除已执行的规则之外的其他规则,那么我认为这可以关闭并且可以提出新的问题。
最有用的评论
向后兼容吗? 仅仅是普通的“ WTF”功能,可能没有多少人想要或使用它吗? 使用的工具尚处于开发阶段,并未得到广泛采用? 我建议重新考虑一下,并在真正迟到之前修复它。