Helm: --set将仅数字值解析为float64

创建于 2016-12-17  ·  68评论  ·  资料来源: helm/helm

我只是注意到,类似helm install --set tag=20161216最终在模板中以科学计数法表示,这是因为{{ typeOf .Value.tag }}产生了float64

甚至对于helm install --set tag=1 -> float64这样的小整数也是如此。

这是在头盔2.1.0中发生的

help wanted

最有用的评论

向后兼容吗? 仅仅是普通的“ WTF”功能,可能没有多少人想要或使用它吗? 使用的工具尚处于开发阶段,并未得到广泛采用? 我建议重新考虑一下,并在真正迟到之前修复它。

所有68条评论

如果您执行--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"}
  • 1个

将YAML简化为JSON会删除许多信息,其中大多数与类型有关。 意味着您不能在部署前输入检查值。

我猜这可以通过移至其他yaml库来解决。 也许这一个: https :

今天在努力解决此问题时,我发现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值中使用了"" ,它可以正常工作,谢谢

根据此评论,对于Helm 3而言,似乎对于Helm 2而言,不再是一个问题。我很想听听谁仍在处理此问题,如何以及使用哪个版本的Helm。

对于Helm 2用户,我们目前仅接受安全补丁,因此我们将不打算为Helm 2修复此错误。但是,如果这仍然与Helm 3有关,那么,我希望社区提供更多有关以下内容的信息:这个特定的错误。

对于头盔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的指示,我设法重现了同样的问题。 谢谢你。 重新开放。

我在相同的问题上打了一个稍微不同的角度。 我的appVersion8482e77 ,如果我在任何地方引用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"

因此,如果有人认为解析无引号的数字应该遵循除已执行的规则之外的其他规则,那么我认为这可以关闭并且可以提出新的问题。

此页面是否有帮助?
0 / 5 - 0 等级